[英]OCMock test an object is allocated and a method is called on it
我终于在我正在研究的项目上强加了一些TDD,并且跑到了边缘......我知道我想要的代码但不知道如何测试它:)
我正在寻找的实现是:
- (void) doSomething
{
FooBuilder *foo = [[FooBuilder alloc] init];
[foo doSomethingElseWithCompletionBlock:^{
[self somethingDone];
}];
}
所以我希望我的测试验证a)测试中的方法分配一个新的FooBuilder
和b)该方法然后调用新对象的方法。
我该怎么做? 我开始尝试模拟alloc
类方法的路径,但很快就确定在那条路上是疯狂的。
注意我没有用这个测试测试FooBuilder本身,只是合作就在那里。
通常,依赖注入用于提供一个完全形成的对象,说“不是要求这个对象,而是在这里,使用它”。 但在这种情况下,我们希望能够实例化一个新对象。 因此,我们所要做的就是注入一个对象,而不是注入一个对象。 “不是创建一个特定的类,而是在这里实例化其中一个。”
依赖注入有两种主要形式:“构造函数注入”(我将坚持使用术语“构造函数”,即使Objective-C将其分为分配和初始化)和“属性注入”。
对于构造函数注入,请在初始化程序中指定类:
- (instancetype)initWithFooBuilderClass:(Class)fooBuilderClass;
对于属性注入,请在属性中指定类:
@property (nonatomic, strong) Class fooBuilderClass;
构造函数注入更清晰,因为它使依赖性变得明显。 但你可能更喜欢注入房产。 有时候我会从另一个方向开始重构,改变主意。
无论哪种方式,您都可以使用默认的初始化程序来调用-initWithFooBuilderClass:
或将属性设置为[FooBuilderClass class]
。
然后doSomething
会这样开始:
- (void)doSomething
{
id foo = [[self.fooBuilderClass alloc] init];
...
我最后通过向FooBuilder
添加一个新类方法来解决这个问题,该方法将完成块作为参数。 所以我有效地将实例化和方法调用从我的测试对象中移出到协作者对象中。 现在我可以模拟那个单类方法调用。
我认为这最终会比我开始的设计稍好一些; 现在需要对实例化的新FooBuilder
实例化的细节隐藏。 它也很简单。
它确实具有保持我的测试对象和FooBuilder
类之间的强耦合的属性。 也许那会让我感到困惑 - 但是我让YAGNI打赌它不会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.