簡體   English   中英

使用Moq進行單元測試 - 值不能為空

[英]Unit Test with Moq - Value can not be null

我正在使用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集合為空。

我究竟做錯了什么?

這是因為test在數據上下文中設置了.Setup(c => c.Books) ,但在實際代碼中訪問GetAll()方法中的Context.Set<TObject>() ,因此對於測試,它最終將為null

嘗試改為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM