如何在ios XCTestCase中单元测试两个对象是不相等的

时间:2014-01-08 15:45:26

标签: ios unit-testing assertions xctest

我对单元测试相当新,特别是在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");

}

2 个答案:

答案 0 :(得分:1)

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))));

答案 1 :(得分:0)

只需测试您实际想要发生的事情,无需过度复杂化测试:

XCTAssertFalse(server1 == server, @"The objects should not be equal");

对象上的==运算符测试指针是否相等,因此如果server1server2的对象相同,则您的测试将失败。

可选地

XCTAssertTrue(server1 != server, @"The objects should not be equal");

如果要测试不同类型的相等性,例如使用isEqual,如果对象的属性相等则返回true,即使对象不是同一个实例,则:< / p>

XCTAssertFalse([server1 isEqual:server], @"The objects should not be equal");

这完全取决于您正在测试的等级类型。