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

ary*_*axt 12 unit-testing dependency-injection mocking objective-c

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

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

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

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

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

@Inject MyObject object;

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

Jon*_*nah 11

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

[[ClassToBeTested alloc] initWithDependency:foo andOtherDepedency:bar];

ClassToBeTested *objectUnderTest = [[ClassToBeTested alloc] init];
objectUnderTest.dependency = foo;
objectUnderTest.otherDependency = bar;
Run Code Online (Sandbox Code Playgroud)

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

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


kub*_*ubi 7

你怎么能模仿MyObject?

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

去测试:

- (void)testMethodToBeTested {
    id mockMyObject = [OCMock mockForClass:[MyObject class]];

    [[mockMyObject expect] setString:[OCMock any]];
    [[mockMyObject expect] doStuff];

    [objectToTest methodToBeTestedWithObject:mockMyObject];
    [mockMyObject verify];
}
Run Code Online (Sandbox Code Playgroud)

正如@Jonah的回答中提到的那样,使用优秀的OCMock.不要费心去做资本-D,资本-I Dependency Injection in obj-c,它的工作量超过了它的价值.