首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AVCaptureDevice模拟OCMock

用AVCaptureDevice模拟OCMock
EN

Stack Overflow用户
提问于 2014-01-07 16:36:37
回答 1查看 1K关注 0票数 1

我正在尝试为我为AVCaptureVideoPreviewLayer实现的点击到焦点方法编写测试。我想使用模拟AVCaptureDevice来传递各种条件,然后确保调用预期的方法来处理实际的聚焦。下面是我正在使用的代码。

代码语言:javascript
复制
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])
            {
            ...

这是我到目前为止拥有的测试代码:

代码语言:javascript
复制
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设备返回不兼容的设备,什么都不会发生。
  • AVCaptureDevice设备返回一个兼容的设备,上面的测试代码通过。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 19:59:14

您可以对类方法“设备”进行存根,以返回包含所选内容的数组。

代码语言:javascript
复制
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]

我想这应该会让你上路的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20976970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档