首页 文章

目标C - 单元测试和模拟对象?

提问于
浏览
12

你如何单元测试Objective C代码? (苹果手机)

在其他语言(如java和.Net)中,您可以使用依赖注入,以便能够在当前代码中进行单元测试并传递模拟对象 . 但是,我无法为目标c找到可靠的依赖注入框架 .

假设你想为下面的代码编写一个单元测试,你怎么能模拟MyObject?

- (void) methodToBeTested
{
     NSString str = @"myString";
     MyObject object = [[MyObject alloc] init];
     [object setString:str];
     [object doStuff];
     [object release];
}

这就是我如何通过依赖注入来做到这一点 . 是否有类似的方法在目标c上实现这一目标?

@Inject MyObject object;

public void methodToBeTested()
{
     String str = "myString";
     // object is automatically instantiated (Dependency Injection)
     object.setString(str);
     object.doStuff();
}

3 回答

  • 7

    在目标c中,控制反转仍然是可行的 . 您当然可以设计基于构造函数或基于属性的依赖注入的类,但我认为您不会像以前那样找到基于注释的依赖注入框架 .

    [[ClassToBeTested alloc] initWithDependency:foo andOtherDepedency:bar];
    
    ClassToBeTested *objectUnderTest = [[ClassToBeTested alloc] init];
    objectUnderTest.dependency = foo;
    objectUnderTest.otherDependency = bar;
    

    我已经看到了为objective-c构建依赖注入框架的几种不同方法,包括https://github.com/mivasi/Objective-IOC,但我不能评论它们的成熟度或实用性 .

    对于对象模拟和存根,请查看OCMock .

  • 1

    你怎么能模仿MyObject?

    - (void) methodToBeTestedWithObject:(MyObject *)object
    {
         NSString str = @"myString";
         [object setString:str];
         [object doStuff];
    }
    

    去测试:

    - (void)testMethodToBeTested {
        id mockMyObject = [OCMock mockForClass:[MyObject class]];
    
        [[mockMyObject expect] setString:[OCMock any]];
        [[mockMyObject expect] doStuff];
    
        [objectToTest methodToBeTestedWithObject:mockMyObject];
        [mockMyObject verify];
    }
    

    正如@Jonah的回答中提到的那样,使用优秀的OCMock . 唐't bother trying to do capital-D, capital-I Dependency Injection in obj-c, it'更多的工作而不是它的 Value .

  • 11

    这是Objective-C的依赖注入框架:http://www.typhoonframework.org

    除了解决DI的设计方面外,它还非常注重能够为 生产环境 与测试场景(集成测试)配置组件 . 这包括:

    • 能够注入表示为字符串的值 - 这些值在运行时转换为所需的类型 .

    • 通过外部属性文件进行配置管理 .

    • 异步测试执行 - 允许您测试在后台线程上运行的方法 .

相关问题