GHUnit,OCMock:如何测试两个指定块之一是不是被调用?

Posted

技术标签:

【中文标题】GHUnit,OCMock:如何测试两个指定块之一是不是被调用?【英文标题】:GHUnit, OCMock: how to test if one of two specified block is called?GHUnit,OCMock:如何测试两个指定块之一是否被调用? 【发布时间】:2012-10-31 05:57:42 【问题描述】:

我有一个接受响应块和错误块的方法,我通过给它有效数据和无效数据来编写单元测试,因此它将分别调用响应块和错误块,但是使用 GHUnit 和 OCMock,我该如何测试如果调用了正确的块?

我在想:

对于有效数据: 回复 GHAssertTrue(YES, @""); 错误 GHAssertTrue(NO, @"有效数据不应调用错误块");

无效数据反之亦然。

我做的对吗?

【问题讨论】:

【参考方案1】:

将断言放入块中的问题是,您不知道是否没有调用任何块。这就是我们所做的:

__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) 
    done = YES;
 errorBlock:^(BOOL success) 
    // should not be called
    expect(NO).to.beTruthy();
];
while (!done) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];

缺点是如果从不调用成功块,测试将在while循环中挂起。您可以通过添加超时来避免这种情况:

NSDate *startTime = [NSDate date];
__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) 
    done = YES;
 errorBlock:^(BOOL success) 
    // should not be called
    expect(NO).to.beTruthy();
];
while (!done && [startTime timeIntervalSinceNow] > -30) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
// make sure it didn't time out
expect(done).to.beTruthy();

【讨论】:

expecta 是我们在测试中使用的断言库。该语句相当于GHAssertTrue(done, @"Check for result block should not have timed out.");【参考方案2】:

我会这样做:

向测试类添加一个属性以指示调用了哪个块 让每个块将该属性设置为不同的值 调用 检查属性值

【讨论】:

以上是关于GHUnit,OCMock:如何测试两个指定块之一是不是被调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何为委托方法编写 GHunit 测试用例?

使用 OCMock 发生意外崩溃,在 NSString 上模拟“mutableCopy”

使用具有未知数量的方法调用的 OCMock

如何使用OCMock验证在Objective C中不调用异步方法?

如何使用 GHUnit 测试委托回调

如何使用 OCMock 3 在单元测试中检查函数的返回值