0

我对单元测试相当陌生,尤其是在 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");

}

4

2 回答 2

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))));
于 2014-01-18T05:15:04.080 回答
0

只需测试您真正想要发生的事情,无需使您的测试过于复杂:

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

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

或者

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

如果要测试不同类型的相等性,例如 done with isEqual,如果对象的属性相等则返回 true,即使对象不是同一个实例,那么:

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

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

于 2014-01-08T16:01:10.757 回答