是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用

Posted

技术标签:

【中文标题】是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用【英文标题】:Is it possible to mock a method(with parameters) call in XCTest unit test case in IOS 【发布时间】:2015-08-28 21:47:34 【问题描述】:

我在我的应用程序中使用第三方框架作为外部附件。在编写单元测试用例时,我需要绕过对库的所有直接调用。

//Actual Code i need to mock
    ExternalDevice *device = [extern.devices firstObject];
// Able to mock this using "mock([ExternalDevice class])"

    //myRequest is a request created using third party Library
    self.myRequest = [device accesoryRequestWithReference:@"123456789" error:&error];
// I need to get a mock object of this request that i can pass from my test case

嘲讽我试过

方法一

 EXternalDeviceRequest * mockRequest = mock([EXternalDeviceRequest class]);
    id mockDevice = [OCMockObject mockForClass:[EXternalDevice class]];
    [[[mockDevice stub]andCall:@selector(accesoryRequestWithReference:error:) onObject:device]willReturn: mockRequest];

方法二

device = mock([EXternalDevice class]);
 EXternalDeviceRequest * mockRequest = mock([EXternalDeviceRequest class]);
[given([device accesoryRequestWithReference:@"" error:nil]) willReturn: mockRequest];

两者都不工作。请帮忙。

提前致谢

【问题讨论】:

【参考方案1】:

尝试使用 OCMock 的宏:

EXternalDeviceRequest * mockRequest = mock([EXternalDeviceRequest class]);
id mockDevice = [OCMockObject mockForClass:[EXternalDevice class]];
OCMStub([mockDevice accesoryRequestWithReference:[OCMArg any] error:[OCMArg setTo:nil]]).andReturn(mockRequest);

【讨论】:

感谢您的更新。我已经尝试了您提到的更改,但我遇到了以下崩溃... *** NSArray *TKArrayArgumentsForInvocation(NSInvocation *__strong)() 中的断言失败,/Users/joreid/Development/Mockito/OCMockito/Source/OCMockito /NSInvocation+TKAdditions.m:102 /Users/sram27/Desktop/Assist/28Mar2015/TESTPROJECT/SAMPLE/SAMPLETests/ViewController.m:163:错误:-[TestViewController testMockingExternalLibrary]:失败:捕获“NSInternalInconsistencyException”,“--未处理输入:^@"

以上是关于是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 XCTest 在 Objective-C 静态库中创建测试用例

iOS 单元测试- Xcode 7测试工具XCTest学习

在 ios6 上运行单元测试是不是有意义

是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?

XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?

iOS:使用 XCTest 对 UIViewController 组件进行单元测试