1

像这样的代码:

@implementation MyClass

- (void)func
{
//MyOtherClassObject is an object passed in when initialising MyClass
    NSArray *signals = @[[RACObserve(MyOtherClassObject, prop) subscribeNext:^{{}]];
}

@end

@implementation MyTest

- (void)testSomething
{
    MyOtherClass *mock = mock([MyOtherClass class]);
    MyClass *myObject = [[MyClass alloc] initWithOtherObject:mock]
    [myObject func];  //this won't work since RACObserve will return nil instead of a valid signal
}

@end

那么,有什么方法可以像普通对象一样获得模拟对象 RACObserved 吗?

4

1 回答 1

1

这是因为 OCMockito(以及 OCMock)破坏了 Key-Value Observing,也就是说,您不会从模拟对象中获得任何 KVO“回调”。并RACObserve在引擎盖下使用 KVO。有许多可能的解决方法:

  1. 如 OCMockito 文档中所述:

你如何存根一个属性以便 KVO 工作?使用 stubProperty(实例、属性、值)。例如:

stubProperty(mockEmployee, firstName, @"fake-firstname");

我没有使用过 OCMockito,所以我不知道这是否真的适用于 RAC。

  1. 使用真实对象而不是模拟对象。它适用于某些情况(当对象非常简单并且您只需要更改属性时)。当然,当它会破坏单元测试的隔离时(例如,通过发送网络请求或访问数据库/文件系统),不应该使用它。

  2. 提取由RACObserve属性和存根返回的信号。代替

NSArray *signals = @[[RACObserve(MyOtherClassObject, prop) subscribeNext:^{{}]];

做:

NSArray *signals = MyOtherClassObject.prop

将在哪里MyOtherClassObject.prop返回RACObserve(self, prop)。然后您可以轻松地存根MyOtherClassObject.prop并返回任何信号,例如[RACSignal return:]同步获取单个值。

于 2015-12-19T19:42:31.703 回答