ios - 使用OCMock时如何检查从测试方法调用传递的回调?

标签 ios objective-c ocmock

如何检查传递的回调 block 是从测试方法调用的?这是我要测试的简化方法:

- (void)loadModel:(Callback)callback {

  // Data loading part...

  // Callbacks with data. Second param usually passes data, but now it will pas nil for demo
  callback(YES, nil, nil);
}

这是我的单元测试,我想测试是否在方法 loadModel 中调用了回调:

- (void)testLoadModelCallbackIsCalled {

  HomeModel *model = [[HomeModel alloc] init];
  id modelMock = OCMPartialMock(model);

  Callback callback = ^(BOOL success, id result, NSError *error){

    XCTAssertTrue(YES, @"Callback not called");
  };

  //[modelMock expect] ...how to expect?];

  [model loadModel:callback];

  //[modelMock verify];
}

问题是无论回调是否被调用,这个测试总是会通过。想用代理 block 解决这个问题,但是整个 loadModel 方法都被代理 block 覆盖了。我只需要验证 loadModel 确实调用了我传递的内容。

更新同时我以简化的解决方法结束:

- (void)testLoadModelCallbackIsCalled {

  HomeModel *model = [[HomeModel alloc] init];

  // Create flag for checking
  __block BOOL isCalled = NO;

  Callback callback = ^(BOOL success, id result, NSError *error){

    isCalled = YES;
  };

  XCTAssertTrue(isCalled, @"Callback not called");
}

UPDATE2 @jszumski 的回答正是我一直在寻找的,我认为 XCTestExpectation 背后的想法与使用您自己的 isCalled bool 标志非常相似。

最佳答案

使用XCTestExpectation,它是异步测试框架的一部分:

- (void)testLoadModelCallbackIsCalled {
    HomeModel *model = [[HomeModel alloc] init];
    id modelMock = OCMPartialMock(model);

    XCTestExpectation *expectation = [self expectationWithDescription:@"Completion called"];
    Callback callback = ^(BOOL success, id result, NSError *error){
        [expectation fulfill];
    };

    [model loadModel:callback];

    [self waitForExpectationsWithTimeout:1 handler:nil];
}

关于ios - 使用OCMock时如何检查从测试方法调用传递的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30434159/

相关文章:

ios - TableView 行上的开关更改会影响其他行

ios - XCode 不在核心数据映射工具上保存实体的位置

ios - 从NSNumber获取CGFloat的最常见和正确的做法是什么?

ios - 如何使 Storyboard 字符串保持最新?

ios - OcMock vs OcMockito - 优缺点是什么

ios - 在 Swift 3 中声明 "NSMapTable StrongObject"

ios - 点击后 UitableView 改变 sectionView

ios - 如何在 iOS 中使用 AddressBook 获取联系人的创建日期

ios - 不使用 OCMClassMock 调用方法

iphone - 为什么我的 OCMock 期望和 stub 在 iOS 5 中失败?