c# - 最小起订量单元测试 - 值不能为空

标签 c# entity-framework unit-testing entity-framework-6 moq

我正在使用 EF6。生成的代码类似于:

public partial class MyDataContext : DbContext
{
    public MyDataContext() : base("name=mydata")
    {
    }

    public virtual DbSet<Book> Books { get; set; }
}

然后我有一个通用的存储库,例如:

public class GenericRepository<TObject> where TObject : class
{
    protected readonly MyDataContext Context;

    protected GenericRepository(MyDataContext context)
    {
        Context = context;
    }

    public virtual DbSet<TObject> GetAll()
    {
        return Context.Set<TObject>();
    }
}

然后我有一个使用 GenericRepository 返回数据的服务:

public class MyDataService<TObject> where TObject : class
{
    private readonly MyDataContext context;

    public MyDataService(MyDataContext ct)
    {
        context = ct;
    }

    public ICollection<TObject> GetAll()
    {
        var r = new GenericRepository<TObject>(context);
        return r.GetAll().ToList();
    }
}

所以我可以用这样的东西得到所有的书:

var ds = new MyDataService<Book>(new MyDataContext());
var data = ds.GetAll();

这工作正常。接下来,我尝试使用 Moq 对上面的代码进行单元测试,例如:

var books = new List<Book>
{
    new Book {Id = 1, Name = "BBB"},
    new Book {Id = 2, Name = "ZZZ"},
    new Book {Id = 3, Name = "AAA"},
}.AsQueryable();

var mockSet = new Mock<DbSet<Book>>();
mockSet.As<IQueryable<Book>>().Setup(m => m.Provider).Returns(books.Provider);
mockSet.As<IQueryable<Book>>().Setup(m => m.Expression).Returns(books.Expression);
mockSet.As<IQueryable<Book>>().Setup(m => m.ElementType).Returns(books.ElementType);
mockSet.As<IQueryable<Book>>().Setup(m => GetEnumerator()).Returns(books.GetEnumerator());

var mockContext = new Mock<MyDataContext>();
mockContext.Setup(c => c.Books).Returns(mockSet.Object);

var service = new MyDataService<Book>(mockContext.Object);
var data = service.GetAll();

但是,我在最后一行收到 "Value cannot be null.\r\nParameter name: source" 错误。当我进入代码时,我看到上下文对象中的 Books 集合是空的。

我做错了什么?

最佳答案

那是因为测试设置.Setup(c => c.Books)在数据上下文中但在实际代码访问中 Context.Set<TObject>()GetAll()方法,因此对于测试,它最终将成为 null .

试试改成

mockContext.Setup(c => c.Set<Book>()).Returns(mockSet.Object);

关于c# - 最小起订量单元测试 - 值不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900828/

相关文章:

c# - 在 C# 中向我的字符串添加 '-'

c# - 无法解释位置 5 处的标记 '!'

c# - 在for循环中获取当前值

.net - Entity Framework 是否支持并行异步查询?

c# - 密码登录异步。参数空异常 : Value cannot be null

c# - 在 C# 2.0+ 中,是否有必要锁定另一个线程将执行的闭包?

c# - Entity Framework 连接字符串问题

android - 在 Meteor 上进行 Junit 测试,Android-DDP 库

javascript - Jasmine 无法实例化 Angular 模块?

javascript - Jest : Mocking third-party modules