1

我正在尝试为我为AVCaptureVideoPreviewLayer. 我想使用一个模拟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 devices] 返回 0 个设备,没有任何反应
  • [AVCaptureDevice devices] 返回一个不兼容的设备并且没有任何反应
  • [AVCaptureDevice devices] 返回兼容设备,上面测试代码通过

所以我想我的问题归结为是否有一种简单的方法来存根和返回[AVCaptureDevice devices]类方法?或者可以安全地假设只有一个AVCaptureDevice通过iPhone/iPad上述条件,所以我可以将设备存储为属性并重写我正在测试的方法,以便我可以注入模拟AVCaptureDevice

4

1 回答 1

1

您可以存根类方法“设备”以返回包含您选择的内容的数组。

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]

我认为这应该让你上路。

于 2014-01-07T19:59:14.997 回答