2016-11-02 3 views
1

通知コールバック(addNotificationBlockに登録されている)が同期的に起動されるようにRealmを設定する方法はありますか?特に、私はテストでこの動作が必要です。レルムaddNotificationBlockを使用したテストコード

コールバックは非同期なので、テストでは使用できません。したがって、代わりにテストでの動作を模倣する依存関係を注入しながら、プロダクションで通知登録をラップする依存関係を注入する必要があります。

これは、a)より多くのコードを必要とし、b)コードがRealmCollectionChangeを構築する方法など、Realmについての前提を作成しているので、それは素晴らしい解決策ではありません。

同期できない場合は、RealmCollectionChangeに依存しているコードをテストするためのより良い方法の提案がありますか?

答えて

2

expectation(description:)waitForExpectations(timeout:handler:)を使用すると、次のように非同期メソッドをテストできます。

func test() { 
    let q = DispatchQueue(label: "Q") 

    q.async { 
     let realm = try! Realm() 
     try! realm.write { 
      realm.add(TestObj()) 
     } 
    } 

    let e = expectation(description: "Notification fired") 

    let realm = try! Realm() 
    let token = realm.addNotificationBlock { (notification, realm) in 
     print("notification block") 
     e.fulfill() 
    } 

    waitForExpectations(timeout: 2.0, handler: nil) 
    token.stop() 
} 
+0

このソリューションは機能しますが、残念ながら理想的ではありません。テストでは、特にテスト対象が統合テストの場合のように通知ブロックから遠く離れている場合、実装の詳細との調整がはるかに必要になります。あなたは依存関係に 'XCTestExpectation'を注入する必要があります。そして、あなたがそれを待つべき時を知る必要があります。また、通知ブロックで待機してはいけませんでしたが、そうしなかった場合、偽陽性の通過テストの可能性があります。 – solidcell

関連する問題