2012-01-31 15 views
2

簡単に言えば、私はリンゴを管理するWCFサービスを持っています。他の機能とは別に、リンゴをストレージに追加したり削除したりする2つの方法があります。私は、誰かが仕事を利用して、リンゴを嫌うかどうかを確認するための統合テストを書いています。 WCFサービスのRaven DBには監査ロールがあり、アクションとリンゴだけを記録します。 WCFサービスの方法にいくつかの他の処理が存在する:クリーニング、検証、パッケージング等WCFと統合テスト用のRavenDbセッション管理

マイ監査統合テストは

  • 空の記憶(RavenDBインメモリモード)
  • ボブとして表現することができます来てます10リンゴ(オープンセッション、処分、追加セッション)
  • ジェイクが来ると
  • 6個のりんごが残っていることを
  • チェック
を(オープンセッションは、処分、セッションを削除します)4個のリンゴを取ります

これらは2人の異なる人(2つのWCF呼び出し)であるため、異なるセッションのインスタンスを使用することは理にかなっています。私は今、異なる2つの類似した統合テストを実行した場合しかし、アップルがセッションに関連付けられていない漆黒のDBと私は

例外

を取得し、 インスタンス

に未知のエンティティを削除することはできません人々はちょうどリンゴをストレージに追加すると、トータルストレージの内容は真実に対応します。これは混乱しているビットです:セッションを越えて作品を追加する、削除は動作しません。 In this post Ayendeは、セッションのマイクロ管理は方法ではないと言いますが、私の統合テストでは異なるセッションを使用するのは自然なことです。リンゴとの類推があなたを押しのけないと思う。

質問: RavenDBとの統合テストでセッションを使用するにはどうすればよいですか?

(メモ帳から)サンプルコードRavenDB、"The session manages change tracking for all of the entities that it has either loaded or stored"

public void Remove(Apple apple) 
{ 
    using (var session = Store.OpenSession()) 
    { 
     session.Delete(apple); 
     session.SaveChanges();  
    } 
} 

public void Add(Apple apple) 
{ 
    using (var session = Store.OpenSession()) 
    { 
     session.Store(apple); 
     session.SaveChanges();  
    } 
} 

... 

var apples = new apples[10]; 
//init 
MyRavenDB.Add(apples); 
MyRavenDB.Remove(apples.Take(4)); //throws here 
//verify 
+0

コードを投稿できますか? –

+0

コードストレージにアクセスできないが、これはセッションのクローズと追加と削除の統合テストで問題が発生しているはずだ。 – oleksii

答えて

3

Remove()メソッドに渡している参照がRavenDBドキュメントストアから発信されていないと思われるため、エラーです。

これを試してください:あなたがワイヤ上のエンティティを渡している

public void Remove(Apple apple) 
{ 
    using (var session = Store.OpenSession()) 
    { 
     var entity = session.Load<Apple>(apple.Id); 

     session.Delete(entity); 
     session.SaveChanges();  
    } 
} 
+0

この行は 'var entity = session.Load (apple.Id)ですか;'絶対に必要ですか?私はエンティティがまだ削除される場合、それを読み込まないようにしようとしています。 – oleksii

+0

'Load <>(id)'メソッドを使用してエンティティを取得することは、高性能な操作です。待ち時間の長い接続を介してリモートのRavenDBインスタンスと通信している場合や、毎秒何百ものドキュメントを削除する予定がある場合を除き、心配しないでください。 –

+0

これは私のために働いた。ありがとう。 – oleksii

3

、それは一般的に大きいノーノー。 はこのようにそれを実行してください:あなたはより良いsematnicsを与えるだろう

public void Remove(string appleId) 

関連する問題