gpt4 book ai didi

c# - EF6 DbSet 在 Moq 中返回 null

转载 作者:太空狗 更新时间:2023-10-29 18:14:53 26 4
gpt4 key购买 nike

我的应用程序中有一个典型的存储库模式设置,带有 DbContext (EF6):

public class MyDbContext : EFContext<MyDbContext> {

public MyDbContext () { }

public virtual DbSet<CartItem> Cart { get; set; }

和存储库:

public class GenericEFRepository<TEntity, TContext>
where TEntity : class, new()
where TContext : EFContext<TContext> {

private readonly TContext _context;

public GenericEFRepository(TContext context) {
_context = context;
}
//...
public virtual TEntity Insert(TEntity item) {
return _context.Set<TEntity>().Add(item);
}

我正在通过创建模拟上下文使用 Moq 4.2(在 this tutorial 之后)对此进行测试:

        // Arrange
var mockSet = new Mock<DbSet<CartItem>>();

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

// Act
var service = new GenericEFRepository<CartItem, MyDbContext>(mockContext.Object);
service.Insert(new CartItem() {
Id = 1,
Date = DateTime.Now,
UserId = 1,
Detail = string.Empty
});

// Assert
mockSet.Verify(s => s.Add(It.IsAny<CartItem>()), Times.Once());

问题是,当我到达这一行时:

return _context.Set<TEntity>().Add(item);

_context.Set<TEntity>()返回空值。经过一些谷歌搜索后,似乎在 EF5 中有必要返回 IDbSet<T>最小起订量模拟集合,但不能使用 EF6。是不是这样,还是我遗漏了什么?

最佳答案

Set<T>() 添加设置方法:

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

即使在真实EFContext属性(property)CartSet<CartItem>()引用同一个对象,上下文的 mock 不知道这一点,因此您需要明确地告诉它要返回什么。

因为它是一个松散的模拟,调用一个尚未设置的方法返回默认值,在本例中为 null .严格模拟可以很好地帮助发现此错误,但也可以 have maintenance costs that other folks don't want to deal with .

关于c# - EF6 DbSet<T> 在 Moq 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569382/

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