OCMockito - 验证方法调用的顺序
OCMockito - Verify order of method invocations
据我所知,无法验证模拟中方法调用的顺序。
还是我遗漏了什么?
- (void)testResetCameraState_resetsCameraView
{
// Arrange
[given([_cameraManagerMock previewLayer]) willReturn:_testLayer];
// Act
[_cameraInteractor resetCameraState];
// Assert
[verifyCount(_cameraViewMock, times(1)) resetPreview];
[verifyCount(_cameraViewMock, times(1)) setPreviewLayer:_testLayer];
}
在这种情况下,您无法验证 setPreviewLayer:
是在 resetPreview
之后调用的。
我想我找到了解决办法。
它基于此拉取请求中添加的 givenVoid
方法:
https://github.com/jonreid/OCMockito/pull/93
遗憾的是它还没有合并,所以你需要自己下载并构建这个版本:
https://github.com/lysannschlegel/OCMockito/tree/given_void
使用新方法,您可以通过以下方式验证方法调用的顺序:
- (void)testResetCameraState_resetsCameraView
{
// Arrange
[given([_cameraManagerMock previewLayer]) willReturn:_testLayer];
[givenVoid([self->_cameraViewMock resetPreview]) willDo:^id (NSInvocation *invocation)
{
[(MKTBaseMockObject*)self->_cameraViewMock reset];
return nil;
}];
// Act
[_cameraInteractor resetCameraState];
// Assert
[verifyCount(_cameraViewMock, never()) resetPreview];
[verifyCount(_cameraViewMock, times(1)) setPreviewLayer:_testLayer];
}
这将在第一次调用 resetPreview
后重置模拟。
所以我们可以在调用之后验证内容:
resetPreview
在第一次调用后永远不会调用。
setPreviewLayer
在 resetPreview 后调用。
reset
调用还会重置 givenVoid() willDo:
,因此第二个 reset
调用不会再次重置模拟。
希望这对您有所帮助,编码愉快 :D
据我所知,无法验证模拟中方法调用的顺序。
还是我遗漏了什么?
- (void)testResetCameraState_resetsCameraView
{
// Arrange
[given([_cameraManagerMock previewLayer]) willReturn:_testLayer];
// Act
[_cameraInteractor resetCameraState];
// Assert
[verifyCount(_cameraViewMock, times(1)) resetPreview];
[verifyCount(_cameraViewMock, times(1)) setPreviewLayer:_testLayer];
}
在这种情况下,您无法验证 setPreviewLayer:
是在 resetPreview
之后调用的。
我想我找到了解决办法。
它基于此拉取请求中添加的 givenVoid
方法:
https://github.com/jonreid/OCMockito/pull/93
遗憾的是它还没有合并,所以你需要自己下载并构建这个版本: https://github.com/lysannschlegel/OCMockito/tree/given_void
使用新方法,您可以通过以下方式验证方法调用的顺序:
- (void)testResetCameraState_resetsCameraView
{
// Arrange
[given([_cameraManagerMock previewLayer]) willReturn:_testLayer];
[givenVoid([self->_cameraViewMock resetPreview]) willDo:^id (NSInvocation *invocation)
{
[(MKTBaseMockObject*)self->_cameraViewMock reset];
return nil;
}];
// Act
[_cameraInteractor resetCameraState];
// Assert
[verifyCount(_cameraViewMock, never()) resetPreview];
[verifyCount(_cameraViewMock, times(1)) setPreviewLayer:_testLayer];
}
这将在第一次调用 resetPreview
后重置模拟。
所以我们可以在调用之后验证内容:
resetPreview
在第一次调用后永远不会调用。setPreviewLayer
在 resetPreview 后调用。
reset
调用还会重置 givenVoid() willDo:
,因此第二个 reset
调用不会再次重置模拟。
希望这对您有所帮助,编码愉快 :D