2017-09-15 178 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

相关问题