首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCMockito:模拟对象RACObserve总是失败

OCMockito:模拟对象RACObserve总是失败
EN

Stack Overflow用户
提问于 2015-12-18 02:24:03
回答 1查看 189关注 0票数 1

代码如下:

代码语言:javascript
复制
@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呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-19 19:42:31

这是因为OCMockito (和OCMock )破坏了键值观察,也就是说,您将不会从模拟对象中得到任何KVO“回调”。RACObserve在引擎盖下使用KVO。有许多可能的解决办法:

  1. 如OCMockito文档中所述:

如何对属性进行存根以使KVO工作?使用stubProperty(实例、属性、值)。例如:

代码语言:javascript
复制
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:]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34347616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档