在Xcode中,我正在运行基于ID创建用户的测试。如果设置了错误的ID,则测试应该失败。虽然这个测试失败了,因为它测试的方法本身就有断言:
[[Apiclient sharedClient] findAndCreateUserWithID:nil success:^(Player *player) {
STFail(@"should not be able to create player with no ID");
} failure:^(NSError *error) {
}];
方法叫做:
- (void)findAndCreateUserWithID:(NSNumber *)ID success:(void (^)(Player *))createdPlayer failure:(void (^)(NSError *error))failure
{
NSParameterAssert(ID);
当参数ID为零时,测试将失败。我知道这是一个非常愚蠢的例子,因为它总是会失败,但是在代码中有更多的断言已经更有用了。什么是运行Xcode单元测试的最佳实践,哪些测试代码已经有断言?
答案 0 :(得分:2)
截至2014年底,如果您正在使用新的测试框架XCTest,那么您希望使用XCTAssertThrowsSpecificNamed
代替较旧的STAssertThrowsSpecificNamed
方法:
void (^expressionBlock)() = ^{
// do whatever you want here where you'd expect an NSParameterAssertion to be thrown.
};
XCTAssertThrowsSpecificNamed(expressionBlock(), NSException, NSInternalInconsistencyException);
答案 1 :(得分:1)
NSParameterAssert
在其断言失败时抛出NSInternalInconsistencyException
(source)。您可以使用STAssertThrowsSpecificNamed
宏测试这种情况。例如:
void (^expressionBlock)() = ^{
[[Apiclient sharedClient] findAndCreateUserWithID:nil success:^(Player *player) {
} failure:^(NSError *error) {
}];
};
STAssertThrowsSpecificNamed(expressionBlock(), NSException, NSInternalInconsistencyException, nil);
我在那里使用表达式块,以便更容易将大量代码放入宏中。