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

How to check passed callback is called from tested method when using 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 标志非常相似。

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