模拟DbSet.AddOrUpdate

时间:2017-05-02 20:32:07

标签: c# entity-framework-6 moq

我按照说明here尝试使用Moq模拟我的DbSetDbContext进行单元测试。

我测试的服务看起来像这样

public class MyItemService
{
   private MyContext context;

   public void AddItem(MyItem item)
   {
      this.context.MyItems.AddOrUpdate(item);
      this.context.SaveChanges();
   }
}

我的单元测试看起来像这样

[TestMethod]
public void AddItem_ShouldSucceed()
{
    var myItems = new Mock<DbSet<MyItem>>();

    var context = new Mock<MyContext>();
    context.Setup(e => e.MyItems).Returns(myItems.Object);          

    MyItemService service = new MyItemService(context.Object);

    service.AddItem(new MyItem
    {
        Id = "1234"
    });
}

当我运行测试时,我得到了异常

System.InvalidOperationException: Unable to call public, instance method AddOrUpdate on derived IDbSet<T> type 'Castle.Proxies.DbSet``1Proxy'. Method not found.

我认为问题是因为AddOrUpdateDbSet上的扩展方法。我我的测试.cs文件中包含System.Data.Entity.Migrations

我尝试添加行

myItems.Setup(e => e.AddOrUpdate(It.IsAny<MyItem>()));

到我的单元测试,但后来我得到了异常

System.NotSupportedException:Expression引用不属于模拟对象的方法:e =&gt; e.AddOrUpdate(new [] {It.IsAny()})

当我测试的方法使用AddOrUpdate时,有什么方法可以让我的单元测试工作吗?

0 个答案:

没有答案