Сравнение двух массивов эквивалентных объектов с помощью набора для киви (Sentesting) - PullRequest
0 голосов
/ 06 октября 2011

Я хочу сравнить два массива для эквивалентных объектов, один - свойство внутри моего класса, а другой - в моем методе тестирования.

Я не могу сравнивать напрямую, поскольку объекты будут выделяться отдельно и, таким образом, будут иметь разные области памяти.

Чтобы обойти это, я реализовал описание для своего объекта, чтобы перечислить его свойства в строке: (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>

theValue инициализирует KWValue байтами и типом target-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;
}

Как сравнить, что эти два массива имеют объекты эквивалентных значений?

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Ваш тест не пройден, поскольку вы сравниваете адреса указателей, а не значения.

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

// 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 result;
}

// in another class
NSArray *myArray = [NSArray arrayWithObjects:obj1, obj2, nil];
NSArray *myOtherArray = [NSArray arrayWithObjects:obj3, obj4, nil];
BOOL result;

result = [self compareVelocitiesInArray:myArray withArray:myOtherArray];
NSLog(@"Do the arrays pass my test? %@", result ? @"YES" : @"NO");
0 голосов
/ 27 января 2015

Еще одна возможность сравнить два массива для одинакового содержимого с Kiwi:

[[theValue(array1.count == array2.count) should] beTrue];
[[array1 should] containObjectsInArray:array2];
[[array2 should] containObjectsInArray:array1];

Сравнение счетчика позволяет убедиться, что один из массивов не содержит объект несколько раз, и, следовательно, гарантирует, что они действительно равны.

...