如何在Xcode中失败断言的代码上运行单元测试?

时间:2013-09-11 07:50:42

标签: ios xcode unit-testing

在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单元测试的最佳实践,哪些测试代码已经有断言?

2 个答案:

答案 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在其断言失败时抛出NSInternalInconsistencyExceptionsource)。您可以使用STAssertThrowsSpecificNamed宏测试这种情况。例如:

void (^expressionBlock)() = ^{
    [[Apiclient sharedClient] findAndCreateUserWithID:nil success:^(Player *player) {
        } failure:^(NSError *error) {
        }];
};

STAssertThrowsSpecificNamed(expressionBlock(), NSException, NSInternalInconsistencyException, nil);

我在那里使用表达式块,以便更容易将大量代码放入宏中。