9

このすばらしい記事に従って、コアデータに関する単体テストを開始しました。セットアップは単純に見え、コードのいくつかのビュー行が含まれます。

- (void)setUp;
{
    [MagicalRecord setDefaultModelWithClass:[self class]];
    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

- (void)tearDown;
{
    [MagicalRecord cleanUp];
}

- (void)testSomeCalculationOnMyEntity;
{
    NSNumber *count = [MyEntity MR_numberOfEntities];
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation");
}

@end

問題は、たとえば、コアデータのメモリ設定内のエンティティの量を(上記のように)呼び出すことで確認するたびに、ファイルベースの設定[MyEntity MR_numberOfEntities]保存されているオブジェクトの量を取得することです。数千のオブジェクト。これはどのように起こりますか?の2行目は、メモリ内の行を示していますね。そして、この場合は、格納されているオブジェクトの量として0を返す必要があります。setUp

提案をありがとう!

編集:

@casademoraは私を正しい軌道に乗せました。次の作品のセットアップは今私にとってはうまくいきます。

- (void)setUp;
{
    [MagicalRecord cleanUp]; // This solved the mystery.

    // I don't now why I had to remove this line, though.
    // [MagicalRecord setDefaultModelWithClass:[self class]];

    [MagicalRecord setupCoreDataStackWithInMemoryStore];
}

- (void)tearDown;
{
    [MagicalRecord cleanUp];
}

- (void)testSomeCalculationOnMyEntity;
{
    NSNumber *count = [MyEntity MR_numberOfEntities];
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation");
}

@end
4

2 に答える 2

1

ここでCoreDataをセットアップするために使用される方法は、ファイルベースのストアをロードするべきではありません。デバッガーを使用してステップインすると、NSInMemoryStoreタイプを使用して永続ストアコーディネーターが初期化されることがわかります...最終的には。

これが発生する理由についての私の推測は、以前のテストケースにcleanUp呼び出しを追加しなかったために、以前のコアデータスタックまたは永続ストアがこのテストにぶら下がったことが原因である可能性があります。

これは、コアデータをユニットテストするために常に使用する正確なコード設定であり、意図しない永続ストアをロードしたことはありません。メソッドをデバッグするときは、必ず次のコマンドを実行してください。

po [self persistentStores]

永続ストアコーディネーターのロードに到達したとき。既存の店舗がある場合、これにより、少なくとも既存の店舗がぶら下がっていることを確認できます。

于 2012-07-31T15:18:50.523 に答える
1

クラスの初期化時に1回実行される以下を追加することもできます。これは私のために働いた。

 +(void)setUp
   {
           [MagicalRecord cleanUp];
   }
于 2013-08-11T21:54:50.983 に答える