2

在 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 为 nil 时测试失败。我知道这是一个非常愚蠢的例子,因为它总是会失败,但是代码中已经有了更多更有用的断言。运行 Xcode 单元测试的最佳实践是什么,哪些测试代码已经有了断言?

4

2 回答 2

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);
于 2015-04-21T02:43:13.983 回答
1

NSParameterAssert当断言失败时抛出NSInternalInconsistencyException( source )。STAssertThrowsSpecificNamed您可以测试宏是否会发生这种情况。例如:

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

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

我在那里使用了一个表达式块,以便更容易地将那么多代码放入宏中。

于 2013-09-11T08:13:33.453 回答