OCMockito - 验证方法调用的顺序

时间:2015-04-20 10:45:48

标签: ios objective-c tdd ocmockito

据我所知,没有办法验证模拟器上方法调用的顺序 或者我错过了什么?

- (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

1 个答案:

答案 0 :(得分:0)

我想我找到了解决方案 它基于此拉取请求中添加的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. 在resetPreview之后调用
  3. setPreviewLayer
  4. reset来电也会重置givenVoid() willDo:,因此第二次reset来电不会再次重置模拟。

    希望这会有所帮助,快乐的编码:D