ios - OCMock 测试分配对象并调用方法

标签 ios objective-c mocking tdd ocmock

我终于将一些 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/

相关文章:

ios - DateFormatter 根据用户时间设置表现不同

iphone - 如何在 iOS 5 中运行多个循环和条件检查?

ios - 使用条码角创建 CGRect?

objective-c - 创建具有订单支持的 NSDictionary

objective-c - 如何从扩展坞中删除图标但保留在cmd-Tab中(Cocoa)

java - 当使用外部模拟 util 库(也使用 java util lib)测试 java util 库时的循环引用

IOS直播流f4m文件

ios - 当模型应该在启动后不久就开始某些事件时,iOS 中的规范设计模式/构造是什么?

testing - 来自同一JSON映射的Wiremock返回成功或错误响应

java - 如何在使用 MockMvc 的测试中避免 NullPointerException?