2014-01-07 51 views
1

我正在嘗試爲我爲AVCaptureVideoPreviewLayer實施的點擊對焦方法編寫測試。我想使用模擬AVCaptureDevice爲了通過各種條件,然後確保調用預期的方法來處理實際的聚焦。以下是我正在使用的代碼。用OCMock嘲笑AVCaptureDevice

NSArray *devices = [AVCaptureDevice devices]; 

for (AVCaptureDevice *device in devices) 
{ 
    if ([device hasMediaType:AVMediaTypeVideo]) 
    { 
     if ([device position] == AVCaptureDevicePositionBack) 
     { 
      CGPoint point = CGPointMake(focus_y, 1-focus_x); 

      if ([device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus] && [device lockForConfiguration:&error]) 
      { 
      ... 

這是測試代碼,我到目前爲止有:

id deviceMock = [OCMockObject niceMockForClass:[AVCaptureDevice class]]; 
[[[deviceMock stub] andReturnValue:@YES] hasMediaType:AVMediaTypeVideo]; 
[(AVCaptureDevice*)[[deviceMock stub] andReturnValue:@(AVCaptureDevicePositionBack)] position]; 
[[[deviceMock stub] andReturnValue:@YES] isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]; 
[[[deviceMock stub] andReturnValue:@YES] lockForConfiguration:nil]; 

[[deviceMock expect] setFocusPointOfInterest:CGPointZero]; 
[[deviceMock expect] setFocusMode:AVCaptureFocusModeAutoFocus]; 
[[deviceMock expect] unlockForConfiguration]; 
[self waitForCompletion:0.55]; //Wait for UI animation 
[deviceMock verify] 

我想執行三個測試:

  • [AVCaptureDevice設備]返回0的設備並沒有任何反應
  • [AVCaptureDevice devices]返回一個不兼容的設備,沒有任何反應
  • [AVCa ptureDevice設備]返回兼容設備和上面的測試代碼通過

所以我想我的問題歸結爲是有一個簡單的方法存根,並返回[AVCaptureDevice devices]類的方法?或者是否可以安全地假設在iPhone/iPad上只有一個AVCaptureDevice通過上述條件,因此我可以將設備作爲屬性存儲並重寫我正在測試的方法,以便我可以注入模擬AVCaptureDevice

+0

你對什麼感到困惑?你能包含你想要執行的測試的僞代碼嗎? –

+0

謝謝我更新了一些更多細節。 – psobko

回答

1

您可以將類方法「devices」存根以返回包含您選擇的內容的數組。

id deviceMock = [OCMockObject niceMockForClass:[AVCaptureDevice class]]; 

// I think you need to change your return value code to this for the booleans: 
[[[deviceMock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] hasMediaType:AVMediaTypeVideo]; 
[[[deviceMock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]; 
[[[deviceMock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] lockForConfiguration:nil]; 

// No need to wrap the position in an NSNumber 
[(AVCaptureDevice*)[[deviceMock stub] andReturnValue:AVCaptureDevicePositionBack] position]; 

// Stub the class method that returns the devices array 
[[[deviceMock stub] andReturn:@[ deviceMock ]] devices]; 

[[deviceMock expect] setFocusPointOfInterest:CGPointZero]; 
[[deviceMock expect] setFocusMode:AVCaptureFocusModeAutoFocus]; 
[[deviceMock expect] unlockForConfiguration]; 
[self waitForCompletion:0.55]; //Wait for UI animation 
[deviceMock verify] 

我認爲應該讓你在路上。

+0

完美我擴大了測試一點,現在一切都是綠色的。謝謝。 – psobko