2014-11-07 2 views
0

Я действительно новичок в этой вещи TDD и записываю тестовые примеры вообще, но я также очень хочу попасть в нее и понять. Хотя на данный момент у меня очень тяжелое время, чтобы окунуться в синтаксис и образ мыслей с помощью заглушки и насмешки.OCMock setup mock class, его свойства и получить базовое понимание

Но я также знаю, что мне просто нужно получить основную вину, чтобы получить момент «ааа».

Atm Я НЕ ТАК. Так что это самое основное, что я знаю, и это мой случай:

У меня есть, например, автомобиль как объект класса из CoreData. INIT является OFC

[MyCar alloc] initWithEntity:<(NSEntityDescription *)> insertIntoManagedObjectContext:<(NSManagedObjectContext *)>

Я хочу, чтобы тест:

- (CLLocationCoordinate2D) locationCoordinatesAtIndex: (NSInteger) index 
{ 

CLLocationCoordinate2D returnValue 
= CLLocationCoordinate2DMake(0.0f, 0.0f); 

/* Sanity check */ 
if (index >= 0 && index < self.carsList.count) 
{ 
    MyCar* coolCar = self.carsList[index]; //array with MyCar objects 
    returnValue = CLLocationCoordinate2DMake(self.coolCar.latitude.doubleValue, 
              self.coolCar.longitude.doubleValue); 
} 
return returnValue; 
} 

Этот метод существует в CarViewController

Так что я имею в виду - Хорошо я буду издеваться над собой MyCarCarViewController и добавить фиксированные значения до self.coolCar.latitude и self.coolCar.longitude:

@interface CarViewController 
@property (nonatomic, strong) MyCar *coolCar; 
@property (nonatomic, strong) NSMutableArray *carsList; //because existing private in .m 
@end 

@interface MyCar (Test) 
@property (nonatomic, strong) NSNumber *latitude; //because existing private in .m 
@property (nonatomic, strong) NSNumber *longitude; //because existing private in .m 
@end 

@interface WTSTestCarLocation : XCTestCase 
@property (nonatomic, strong) CarViewController *carVC; 
@end 


-(void)testCarLoc{ 

self.carVC = OCMClassMock([WTSARViewController class]);` 
self.coolCar = [OCMockObject mockForClass:[MyCar class]]` 


self.coolCar.latitude = @7.05444; 
self.coolCar.longitude = @125.601087; 
[self.carsLists addObject:self.coolCar]; 


OCMStub([self.carVC locationCoordinatesAtIndex:0]); 
/* atm I just log */ 
NSLog(@"the location2DLat %f",[self.carVC locationCoordinatesAtIndex:0].latitude);` 

} 

я получаю ошибки, где компилятор говорит «doesNotRecognizeSelector:» провал на линии

self.coolCar.latitude = @7.05444;

Так Q: Мне нужно сделать частичный макет делать Insted? и как это будет, как с NSEntityDescription и NSManagedObjectContext

Любая помощь, указатели и так далее ценится

ответ

0

Возможно ли, что широта и долгота только для чтения свойства в их первоначальном определении и не имеют определитель?

Вы в принципе имеете правильную идею. Вы не должны заглушать метод, который вы пытаетесь протестировать, и обычно вам не нужен тест, чтобы иметь свои собственные переменные-члены, вы можете создавать локальные переменные в самом методе тестирования.

Я хотел бы предложить этот подход, с разметкой в ​​синтаксисе 3.x OCMock:

-(void)testCarLoc 
{ 
    // Create test data 
    double testLatitude = 7.05444; 
    double testLongitude = 125.601087; 

    // Use a partial mock for the car object to "set" its private property 
    id *carPartial = OCMPartialMock([MyCar new]); 
    OCMStub([carPartial latitude]).andReturn(@(testLatitude); 
    OCMStub([carPartial longitude).andReturn(@(testLongitude)); 

    // Use a partial mock for the object under test to "set" its private property 
    id *carVCPartial = OCMPartialMock([CarViewController new]); 
    OCMStub([carVCPartial carsList]).andReturn(@[carPartial]); 

    // Perform the action you want to test 
    CLLocationCoordinate2D result = [carVCPartial locationCoordinatesAtIndex:0]; 

    // Verify the results 
    XCTAssertEquals(result.latitude, testLatitude); 
    XCTAssertEquals(result.longitude, testLongitude); 
} 
Смежные вопросы