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 docs で説明されているように:

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 に答える