2017-09-15 128 views
-1

可以說我有這樣的嘲諷代碼第一實體框架的實體

public class FooEntity 
    { 
     private BarEntity Bar; 

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

      if (result) 
       DoThis(); 

      else 
       DoThat(); 

     } 

     private void DoThis() { } 

     private void DoThat() { } 
    } 

我試圖測試FooEntity類。從單元測試的角度來看,我想模擬BarEntity並提供測試結果,因爲我沒有測試BarEntity。

我看過的每個模擬框架似乎都需要mock接口。最後我檢查了不支持在Entity Framework中將接口用作導航屬性。我得到,我可以添加一個未映射的屬性到我的接口類型的實體並使用它。這樣做似乎有點麻煩,只是爲了滿足一些測試。

有沒有更好的方法?

+1

如果Foo是一個EF實體,我會保持簡單。沒有方法。 – mayu

+0

什麼設置吧? – mayu

+0

@mayu:這就是我的奮鬥目標。我一直保留由字段,getter和setter組成的實體(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

相關問題