#iphone #objective-c #bdd #sentestingkit
#iPhone #objective-c #bdd #sentestingkit
Вопрос:
Я хочу сравнить два массива для эквивалентных объектов, один из которых является свойством внутри моего класса, а другой — в моем методе тестирования.
Я не могу сравнивать напрямую, поскольку объекты будут выделены отдельно и, следовательно, будут иметь разные ячейки памяти.
Чтобы обойти это, я внедрил описание для своего объекта, чтобы перечислить его свойства в строке: (vel — это CGPoint)
- (NSString *)description {
return [NSString stringWithFormat:@"vel:%.5f%.5f",vel.x,vel.y];
}
Я тестирую с:
NSLog(@"moveArray description: %@",[moveArray description]);
NSLog(@"currentMoves description: %@", [p.currentMoves description]);
[[theValue([moveArray description]) should] equal:theValue([p.currentMoves description])];
Выход моего NSLog:
Project[13083:207] moveArray description: (
"vel:0.38723-0.92198"
)
Project[13083:207] currentMoves description: (
"vel:0.38723-0.92198"
)
Но мой тест не удался:
/ProjectPath/ObjectTest.m:37: error: -[ObjectTest example] : 'Object should pass test' [FAILED], expected subject to equal <9086b104>, got <7099e004>
Значение инициализирует значение KWValue байтами и типом objective-C и устанавливает его значение с помощью
- (id)initWithBytes:(const void *)bytes objCType:(const char *)anObjCType {
if ((self = [super init])) {
objCType = anObjCType;
value = [[NSValue alloc] initWithBytes:bytes objCType:anObjCType];
}
return self;
}
Как я могу сравнить, что эти два массива имеют объекты с эквивалентными значениями?
Ответ №1:
Ваш тест завершается неудачно, потому что вы сравниваете адреса указателей, а не значения.
Вы можете выполнить итерацию по одному массиву и сравнить каждый объект с эквивалентно расположенным объектом во втором массиве. Убедитесь, что ваше сравнение выполнено правильно для типа значения, которое вы сравниваете. Если каждый элемент имеет другой тип, это становится сложнее.
// in some class
- (BOOL)compareVelocitiesInArray:(NSArray *)array1 withArray:(NSArray *)array2
{
BOOL result = YES;
for (uint i = 0; i < [array1 count]; i ) {
CustomObject *testObj1 = [array1 objectAtIndex:i]
CustomObject *testObj2 = [array2 objectAtIndex:i]
// perform your test here ...
if ([testObj1 velocityAsFloat] != [testObj2 velocityAsFloat]) {
result = NO;
}
}
return resu<
}
// in another class
NSArray *myArray = [NSArray arrayWithObjects:obj1, obj2, nil];
NSArray *myOtherArray = [NSArray arrayWithObjects:obj3, obj4, nil];
BOOL resu<
result = [self compareVelocitiesInArray:myArray withArray:myOtherArray];
NSLog(@"Do the arrays pass my test? %@", result ? @"YES" : @"NO");
Ответ №2:
Еще одна возможность сравнить два массива для равного содержимого с помощью Kiwi:
[[theValue(array1.count == array2.count) should] beTrue];
[[array1 should] containObjectsInArray:array2];
[[array2 should] containObjectsInArray:array1];
Сравнение количества гарантирует, что один из массивов не содержит объект несколько раз и, следовательно, гарантирует, что они ДЕЙСТВИТЕЛЬНО равны.