使用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];
}
如何检查传递的回调块是从测试方法调用的?这是我要测试的简化方法:
- (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];
}