带有中间变量的 OCMock 测试代码
Posted
技术标签:
【中文标题】带有中间变量的 OCMock 测试代码【英文标题】:OCMock test code with intermediate variable 【发布时间】:2014-11-14 16:57:52 【问题描述】:我不熟悉使用 OCMock。我有以下要测试的简化代码 -
@implementation ViewController
- (void)presentSomething:(NSString *)string
NSLog(@"doSomethingElseWithString - %@", string);
- (BOOL)handleResult:(NSString *)result
BOOL handled = YES;
NSString *changedString = [result uppercaseString];
[self presentSomething:changedString];
return handled;
@end
我有一个测试如下
- (void)testExample
ViewController *vc = [ViewController new];
id mockViewController = OCMPartialMock(vc);
OCMStub([mockViewController presentSomething:@"1234"]);
BOOL handled = [vc handleResult:@"1234"];
XCTAssertTrue(handled);
OCMVerify([mockViewController presentSomething:@"1234"]);
我想验证在我调用 handleResult 后,presentSomething 是否被正确的参数调用。
测试要么在验证时给出 EXC_BAD_ACCESS,要么失败,说明没有调用 presentSomething 方法。
如果我按如下方式更改 handleResult 方法,则测试运行并通过。
- (BOOL)handleResult:(NSString *)result
BOOL handled = YES;
[self presentSomething:result];
return handled;
似乎是中间 [result uppercaseString] 和变量导致了这个问题。这是我如何使用 OCMock 的问题还是 OCMock 中的错误?
【问题讨论】:
【参考方案1】:必须尝试进行指针比较而不是 isEquals。我还没有尝试针对源代码调试问题,但是有一个解决方法:
- (void)testExample
ViewController *vc = [ViewController new];
id mockViewController = OCMPartialMock(vc);
OCMExpect([mockViewController presentSomething:@"1234"]);
BOOL handled = [vc handleResult:@"1234"];
XCTAssertTrue(handled);
OCMVerifyAll(mockViewController);
【讨论】:
以上是关于带有中间变量的 OCMock 测试代码的主要内容,如果未能解决你的问题,请参考以下文章
用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。
使用 OCMock 测试 NSWidowController