我终于将一些 TDD 强加到我正在从事的项目中,并且遇到了边缘......我知道我想要的代码但不知道如何测试它:)
我正在寻找的实现是:
- (void) doSomething
{
FooBuilder *foo = [[FooBuilder alloc] init];
[foo doSomethingElseWithCompletionBlock:^{
[self somethingDone];
}];
}
所以我希望我的测试验证 a) 被测方法分配了一个新的 FooBuilder
和 b) 该方法然后调用新对象上的方法。
我该怎么做?我开始走上尝试模拟 alloc
类方法的道路,但很快就确定这条路是疯狂的。
请注意,我没有使用此测试来测试 FooBuilder 本身,只是存在协作。
最佳答案
通常情况下,依赖注入(inject)用于提供一个完整的对象,即“不要请求这个对象,在这里,使用这个”。但在这种情况下,我们希望能够实例化一个新对象。因此,我们所要做的就是注入(inject)类,而不是注入(inject)对象。 “与其创建一个特定的类,不如实例化其中一个。”
依赖注入(inject)有两种主要形式:“构造函数注入(inject)”(我将坚持使用术语“构造函数”,尽管 Objective-C 将其分为分配和初始化)和“属性注入(inject)”。
对于构造函数注入(inject),在初始化器中指定类:
- (instancetype)initWithFooBuilderClass:(Class)fooBuilderClass;
对于属性注入(inject),在属性中指定类:
@property (nonatomic, strong) Class fooBuilderClass;
构造函数注入(inject)更清晰,因为它使依赖关系变得明显。但是您可能更喜欢属性注入(inject)。有时我从一种方式开始,然后重构为另一种方式,从而改变主意。
无论哪种方式,您都可以拥有一个默认初始化程序,它可以调用 -initWithFooBuilderClass:
或将属性设置为 [FooBuilderClass class]
。
然后 doSomething
会像这样开始:
- (void)doSomething
{
id foo = [[self.fooBuilderClass alloc] init];
...
关于ios - OCMock 测试分配对象并调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916066/