SOで同様の質問を見たことがありますが、どの回答も私の問題を解決していないようです。
カスタム関数を使用して mogenerator によって生成された NSManagedObject クラスがあります(モデルにはありません):
@interface MyManagedClass : _MyManagedClass {
-(NSNumber*)getRandomNumber2;
-(void)function_I_want_to_test;
}
私の function_I_want_to_test() は random() の結果に依存しており、これはテスト中に制御する必要があるものです。random() をモックできないので、OCMock と静的クラス関数に多くの問題があったため、静的ではない関数ラッパーを作成しました。
単体テストのセットアップは次のようになります。
[MagicalRecord setDefaultModelFromClass:[self class]];
[MagicalRecord setupCoreDataStackWithInMemoryStore];
デバッガーを使用して、モデルが正しく読み込まれていることを確認できました。また、非魔法の方法で行う場合:
NSBundle *b = [NSBundle bundleForClass:[self class]];
model = [NSManagedObjectModel mergedModelFromBundles:@[b]];
この時点以降、 random() ラッパー関数をスタブ化するためのモックを作成できません
クラスモックを試してみました
id mock = [OCMockObject mockForClass:[MyManagedClass class]];
[[[mock stub] andReturn:@50] getRandomNumber2];
MyManagedClass *my_object = [mock MR_createEntity];
部分モックを使ってみました
MyManagedClass *my_object = [MyManagedClass MR_createEntity];
id mock2 = [OCMockObject partialMockForObject:my_object];
最後のポイントの後、mock2 のインスタンスを作成するだけで、my_object の動的プロパティが破壊され、役に立たなくなります。
また、スタブしたい関数でモックプロトコルを使用しようとしましたが、まだ役に立ちません。
実行時例外は、Core Data オブジェクトを使用したテストで使用するときに他の人が取得する通常の例外です。プロパティは認識されないセレクターです。
ただし、私にとって奇妙なことは、動的プロパティをスタブしようとしているのではなく、コンパイル時に既知の通常の関数をスタブしようとしているということです。したがって、OCMock を使用するとインスタンスが役に立たなくなるのは奇妙に思えます。
理想的には、OCMock/Mogenerator/Magicalrecord を使用するものが欲しいです。
私は何を間違っていますか?