如何在 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");

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

或者

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

如果你想测试不同类型的相等性,比如用isEqual完成,如果对象的属性相等则返回true,即使对象不是同一个实例,那么:

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

这完全取决于您要测试的平等类型。

【讨论】:

以上是关于如何在 ios XCTestCase 中对两个对象不相等进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何创建对对象的引用以在 iOS 中对其进行动画处理

如何在 XCTestCase 中测试 NSPersistentDocument?

如何使用 XCTestCase 测试异步代码

如何迭代测试数据,然后传递给 XCTestCase?

iOS XCTestCase 启动、执行一些操作、终止应用并重新启动应用

XCTestCase 使用异步操作设置一次