带有中间变量的 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

OCMock:存根从不匹配签名

经典源码分析之 OCMock

使用 OCMock 和 MagicalRecord 进行单元测试

如何使用 OCMock 测试类方法