如何在 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,猕猴桃,预期和雪松等框架中。例如,在oChamcrest中,匹配器可以由其他匹配器组成,因此您可以在任何匹配器周围缠绕生成的isNot(…)
。要测试server1和server2是不是等于,它是
assertThat(server, isNot(equalTo(server1))));
.
同样,要测试Server1和Server2是不是相同的,它是
assertThat(server, isNot(sameInstance(server1))));
. 不隶属于 StackOverflow