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 后重置模拟。
所以我们可以在调用之后验证内容:

  1. resetPreview 在第一次调用后永远不会调用。
  2. setPreviewLayer 在 resetPreview 后调用。

reset 调用还会重置 givenVoid() willDo:,因此第二个 reset 调用不会再次重置模拟。

希望这对您有所帮助,编码愉快 :D