Как XCTAssertEqual NSArray с пользовательскими объектами?

#ios #unit-testing #nsarray #xctest

#iOS #модульное тестирование #nsarray #xctest

Вопрос:

Это мой файл h

 @class TBL_CardView;

@interface TBL_CardsOnTableView: NSObject

- (CGPoint) addCard:(TBL_CardView *)cardView didFailWithError:(NSError **)error;
- (unsigned int) numberOfCardOnTable;

- (NSArray*) cardsOnTableWithPosition;

@end

@interface TBL_CardOnTableWithPosition: NSObject

- (instancetype)initWithCardView:(TBL_CardView*) cardView  withPosition:(NSUInteger) position;

@property(readonly) TBL_CardView*  card;
@property(readonly) NSUInteger position;

@end
 

в m-файле я делаю

 - (NSArray*) cardsOnTableWithPosition
{
    return (NSArray*) _cardsOnTable;
}
 

_cardsOnTable — это

 NSMutableArray *_cardsOnTable;
_cardsOnTable = [[NSMutableArray alloc] initWithCapacity:8];
 

и я добавляю новый объект с помощью этого кода:

 TBL_CardOnTableWithPosition* cvwp = [[TBL_CardOnTableWithPosition alloc] initWithCardView:cardView withPosition:avalableLocation] ;

[_cardsOnTable addObject:cvwp];
 

И вот как я тестирую в модульном тестировании

 [table cardsOnTableWithPosition];
TBL_CardOnTableWithPosition* cvwp1 = [[TBL_CardOnTableWithPosition alloc] initWithCardView:cardView1 withPosition:1] ;
NSLog(@"%@", [table cardsOnTableWithPosition]);

NSArray* array = [table cardsOnTableWithPosition];
NSArray * a = [[NSArray alloc] initWithArray:@[cvwp1]];
NSArray * d = [table cardsOnTableWithPosition];
XCTAssertEqual(a, d); // FAILD, but this I am expecting to failed 
XCTAssertEqualObjects(a, d);  // FAILD
XCTAssertEqualObjects(@[cvwp1], [table cardsOnTableWithPosition]);  // FAILD

XCTAssertTrue([a isEqualToArray:d]); // FAILD
 

В отладчике объекты a и d одинаковы, но я могу найти способ, как протестировать его в модульном тестировании.
Есть идеи, почему?

Ответ №1:

Я нашел проблему.

Мне нужно было реализовать — (BOOL)isEqual:(id)объект
в моих пользовательских объектах.

Комментарии:

1. Не забудьте -hash также реализовать.