c# - 模拟 DbContext.set<T>.Add() EF6

标签 c# .net entity-framework unit-testing moq

我有以下类(其中 PilsnerContext 是 DbContext 类):

public abstract class ServiceBase<T> : IService<T> where T: class, IEntity
{
    protected readonly PilsnerContext Context;

    protected ServiceBase(PilsnerContext context)
    {
        Context = context;
    }

    public virtual T Add(T entity)
    {
        var newEntity = Context.Set<T>().Add(entity);
        Context.SaveChanges();
        return newEntity;
    }
}

public class ProspectsService : ServiceBase<Prospect>
{
    public ProspectsService(PilsnerContext context) : base(context){}

}

我正在尝试对模拟上下文的 Add 方法进行单元测试,例如:

[TestClass]
public class ProspectTest
{
    [TestMethod]
    public void AddProspect()
    {
        var mockProspect = new Mock<DbSet<Prospect>>();
        var mockContext = new Mock<PilsnerContext>();

        mockContext.Setup(m => m.Prospects).Returns(mockProspect.Object);

        var prospectService = new ProspectsService(mockContext.Object);

        var newProspect = new Prospect()
        {
            CreatedOn = DateTimeOffset.Now,
            Browser = "IE",
            Number = "1234567890",
            Visits = 0,
            LastVisitedOn = DateTimeOffset.Now
        };

        prospectService.Add(newProspect);

        mockProspect.Verify(m=>m.Add(It.IsAny<Prospect>()), Times.Once);
        mockContext.Verify(m=>m.SaveChanges(), Times.Once);
    }
}

但是断言:

mockProspect.Verify(m=>m.Add(It.IsAny<Prospect>()), Times.Once);

我认为失败是因为我在 Add 方法中使用了 Context.set().Add() 而不是 Context.Prospects.Add() 但是通过此测试的正确方法是什么?

异常(exception)情况是:

Expected invocation on the mock once, but was 0 times: m => m.Add(It.IsAny<Prospect>()) No setups configured. No invocations performed.

提前致谢。

最佳答案

看起来您只是缺少返回 DbSet 的设置:

mockContext.Setup(m => m.Set<Prospect>()).Returns(mockProspect.Object);

关于c# - 模拟 DbContext.set<T>.Add() EF6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24395194/

相关文章:

c# - Windows C# 快速入门需要什么?

.net - Common.Loging与多个工厂适配器

c# - 当鼠标悬停在列标题上时滚动 ListView

sql - Entity Framework 加入空条件

c# - 如何获取从网站上传的 Excel 文件并以编程方式将数据导入 SQL Server?

c# - Visual Studio 2015 添加发布版本号

.NET Entity Framework FirstOrDefaultAsync 抛出强制转换错误

c# - EF7 DB-First : Scaffold-DBContext produces model without constructor or setter on ICollection

c# - 如何确定鼠标是否指向光标下窗口的最大化按钮

.net - 回发数据和 View 状态数据有什么区别