gpt4 book ai didi

c# - 模拟 DbSet.AddOrUpdate

转载 作者:太空狗 更新时间:2023-10-30 00:18:03 24 4
gpt4 key购买 nike

我正在按照说明进行操作 here试图 mock 我的 DbSetDbContext使用 Moq 进行单元测试。

我正在测试的服务如下所示

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 上的扩展方法.我确实System.Data.Entity.Migrations包含在我的测试 .cs 文件中。

我尝试添加行

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

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

System.NotSupportedException:表达式引用了一个不属于模拟对象的方法:e => e.AddOrUpdate(new[] { It.IsAny() })

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

最佳答案

我在搜索类似问题后遇到了这个老问题。

我们需要做的就是创建 MockableDbSetWithExtensions 抽象类,并在您想测试方法时使用它代替 DbSet它调用 AddOrUpdate

It is how Entity Framework team tests their code too.

public abstract class MockableDbSetWithExtensions<T> : DbSet<T>
where T : class
{
public abstract void AddOrUpdate(params T[] entities);
public abstract void AddOrUpdate(Expression<Func<T, object>>
identifierExpression, params T[] entities);
}

用法

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

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

MyItemService service = new MyItemService(context.Object);

...
}

关于c# - 模拟 DbSet.AddOrUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com