在使用OCMock时,如何检查传递的回调是从测试方法调用的?

时间:2015-05-25 08:34:35

标签: ios objective-c ocmock

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

- (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];
}

问题是,无论是否调用回调,此测试都将始终通过。考虑使用代理块解决此问题,然后使用代理块覆盖整个loadModel方法。我只需要验证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标志。

1 个答案:

答案 0 :(得分:2)

使用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];
}