как выполнить модульное тестирование, когда два объекта не равны в ios XCTestCase
-
20-12-2019 - |
Вопрос
Я новичок в модульном тестировании, особенно в iOS.
У меня есть тестовый пример, который должен пройти успешно, если я вижу, что два объекта НЕ равны.
Я не могу найти метод, который дает мне это, кроме запроса на провал теста при проверке их равенства.
Я не хочу, чтобы тест провалился для объектов, которые не равны,
я хочу, чтобы тест прошел успешно, если объекты не равны.
Какой метод позволит это сделать?
Это мой метод тестирования:
-(void)testServerProtocolSetting{
ServerProtocol *server = [ServerProtocol sharedInstance];
id stub = [OCMockObject mockForClass:[ServerProtocol class]];
ServerProtocol *server1 = server;
[[stub expect]isNULL];
[ServerProtocol setSharedInstance:stub];
[stub verify];
server = [ServerProtocol sharedInstance];
XCTAssertEqualObjects(server1, server, @"server and server1 are not equal");
}
Решение
Просто протестируйте то, что вы на самом деле хотите, не нужно слишком усложнять тест:
XCTAssertFalse(server1 == server, @"The objects should not be equal");
тот ==
оператор на объектах проверяет равенство указателей, поэтому, если server1
это те же объекты, что и server2
тогда ваш тест завершится неудачей, как вы хотите.
Альтернативно
XCTAssertTrue(server1 != server, @"The objects should not be equal");
Если вы хотите проверить равенство другого типа, например, с помощью isEqual
, который возвращает true, если атрибуты объекта равны, даже если объекты не являются одним и тем же экземпляром, тогда:
XCTAssertFalse([server1 isEqual:server], @"The objects should not be equal");
Все зависит от того, какой тип равенства вы проверяете.
Другие советы
Макросы XCTest обычно поддерживают истинные условия, а не ложные.Итак, пока вы можете сказать
XCTAssertEqualObjects(server1, server);
проверять на равенство и
XCTAssertEqual(server1, server);
чтобы проверить идентичность, их непросто инвертировать.Вам придется вернуться к XCTAssertTrue/False, что не так хорошо, поскольку оно просто сообщает вам, что утверждение не удалось, но не сообщает вам значения, если вы явно не включите их в сообщение:
XCTAssertFalse([server1 isEqual:server], @"Oops, both objects equal %@", server);
Здесь пригодятся более выразительные средства сопоставления, которые можно найти в таких средах, как OCHamcrest, Kiwi, Expecta и Cedar.Например, в OCHamcrest средства сопоставления могут состоять из других средств сопоставления, поэтому вы можете обернуть их isNot(…)
вокруг любого совпадения.Чтобы проверить, что server1 и server2 нет равный, это
assertThat(server, isNot(equalTo(server1))));
Аналогично, чтобы проверить, что server1 и server2 нет идентичны, это
assertThat(server, isNot(sameInstance(server1))));