Сравнение двух массивов для эквивалентных объектов с помощью Kiwi (Sentesting) Kit

#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];
  

Сравнение количества гарантирует, что один из массивов не содержит объект несколько раз и, следовательно, гарантирует, что они ДЕЙСТВИТЕЛЬНО равны.