2017-09-15 11 views
-1

は私がFooEntityをテストしようとしているこのモッキングコード最初のEntity Frameworkのエンティティ

public class FooEntity 
    { 
     private BarEntity Bar; 

     public void DoSomething() 
     { 
      var result = Bar.DoSomethingElse(); 

      if (result) 
       DoThis(); 

      else 
       DoThat(); 

     } 

     private void DoThis() { } 

     private void DoThat() { } 
    } 

のようなクラスを考えてみましょう。単体テストの観点から、私はBarEntityをテストしていないので、BarEntityを模擬してテスト結果を提供したい。

私が見たすべてのモックフレームワークは、モック用のインターフェイスを必要とするようです。最後にチェックされたEntity Frameworkのナビゲーションプロパティとしてのインターフェイスの使用はサポートされていません。私は、インターフェイス型のエンティティにマップされていないプロパティを追加して使用することができます。それはちょうどいくつかのテストを満たすためにそれを行うためにちょっと面倒なようです。

良い方法がありますか?

+1

FooがEFエンティティの場合、私は単純にしておきます。メソッドはありません。 – mayu

+0

バーの設定は? – mayu

+0

@mayu:それは私が苦労するものです。私はフィールド、ゲッター、セッターからなるエンティティ(Java)を常に保ってきました。メソッドはありません。私がこのように見たコードのほとんどは、ドメインモデルが事実上ありません。エンティティのプロパティを操作するだけのサービスクラスがあります。私は別のドメインモデルから前後にマップすることなく、エンティティ自体にいくつかの動作を追加しようとしていました。 – int21h

答えて

1
using Moq; 

public class FooEntity 
{ 
    //if Bar is a table, you should write like this: 
    public virtual BarEntity Bar {get;set;} 
    public int BarId {get;set;} 

    public void DoSomething() 
    { 
     var result = Bar.DoSomethingElse(); 

     if (result) 
      DoThis(); 
     else 
      DoThat(); 
    } 

    private void DoThis() { } 
    private void DoThat() { } 
} 

var mock = new Mock<BarEntity>(); 
//DoSomethingElse method should be virtual and BarEntity should not be sealed 
mock.Setup(x => x.DoSomethingElse()).Returns(true);//or false 
var target2test = new FooEntity { Bar = mock.Object }; 
//action: 
target2test.DoSomething();//will result to DoThis calling 
+0

ありがとうございました。私はちょうどC#に入るJavaの男です。モックするためにプロパティがバーチャルでなければならないことを認識していませんでした。再度、感謝します。 – int21h

関連する問題