如何在 ios XCTestCase 中对两个对象不相等进行单元测试
Posted
技术标签:
【中文标题】如何在 ios XCTestCase 中对两个对象不相等进行单元测试【英文标题】:how to unit test two objects are not equal in ios XCTestCase 【发布时间】:2014-01-08 15:45:25 【问题描述】:我对单元测试相当陌生,尤其是在 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");
【问题讨论】:
【参考方案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))));
【讨论】:
【参考方案2】:只需测试您真正想要发生的事情,无需使您的测试过于复杂:
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");
这完全取决于您要测试的平等类型。
【讨论】:
以上是关于如何在 ios XCTestCase 中对两个对象不相等进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
如何在 XCTestCase 中测试 NSPersistentDocument?