как выполнить модульное тестирование, когда два объекта не равны в ios XCTestCase

StackOverflow https://stackoverflow.com//questions/21000189

Вопрос

Я новичок в модульном тестировании, особенно в 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))));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top