我对单元测试相当新,特别是在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");
}
答案 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");
对象上的==
运算符测试指针是否相等,因此如果server1
与server2
的对象相同,则您的测试将失败。
可选地
XCTAssertTrue(server1 != server, @"The objects should not be equal");
如果要测试不同类型的相等性,例如使用isEqual
,如果对象的属性相等则返回true,即使对象不是同一个实例,则:< / p>
XCTAssertFalse([server1 isEqual:server], @"The objects should not be equal");
这完全取决于您正在测试的等级类型。