【发布时间】:2014-10-10 14:43:41
【问题描述】:
我是模拟和使用 Moq 的新手。这是我第一次尝试模拟添加功能。我有 mocks 设置,它适用于读取函数,但是当我尝试对 add 方法进行单元测试时,它会将更改保存到 db。
如何模拟 add 方法?
我想我必须模拟具有 SaveChanges() 方法的 UnitOfWork 类。我想知道如何设置模拟来拦截对SaveChanges() 的调用而不是保存到数据库。
这是我到目前为止的模拟
[SetUp]
public void SetUp()
{
addCount = 0;
IEnumerable<Platform> platformList = new List<Platform>(){
new Platform() { Id = 1, Name = "Unknown"},
new Platform() { Id =2, Name = "Amazon"},
new Platform() { Id = 3, Name = "Prime Pantry"}
};
var platformData = platformList.AsQueryable();
var mockPlatformSet = new Mock<DbSet<Platform>>();
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.Provider).Returns(platformData.Provider);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.Expression).Returns(platformData.Expression);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.ElementType).Returns(platformData.ElementType);
mockPlatformSet.As<IQueryable<Platform>>().Setup(m => m.GetEnumerator()).Returns(platformData.GetEnumerator());
mockPlatformSet.Setup(m => m.Add(It.IsAny<Platform>())).Callback(() => addCount++);
var mockContext = new Mock<ApplicationDbContext>(){ CallBase = true };
mockContext.Setup(m => m.Platforms).Returns(mockPlatformSet.Object);
mockContext.Setup(m => m.Platforms.Add(It.IsAny<Platform>()));
mockContext.Setup(m => m.Platforms.Add(It.IsAny<Platform>())).Callback(() => addCount++);
unitOfWork = new UnitOfWork(mockContext.Object);
platformRepo = new PlatformRepository(mockContext.Object);
controller = new PlatformController(platformRepo, unitOfWork);
}
添加 UnitOfWork 代码
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;
private bool _isDisposed = false;
public UnitOfWork(DbContext context)
{
_context = context;
}
public void SaveChanges()
{
_context.SaveChanges();
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{
_context.Dispose();
}
}
_isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
更新问题
我正在尝试对 PlatformController 的 Create 方法进行单元测试。在这种方法中,我在存储库上调用Add 函数,然后调用UnitOfWork 的SaveChanges 函数。我想验证我的 Platform 对象是否已添加到 DbSet,但“拦截”对 SaveChanges() 的调用以使其不写入 db。
我该怎么做?
【问题讨论】:
-
当我尝试进行模拟时,我在上下文中模拟了集合。
-
你能添加
UnitOfWork构造函数的代码吗? -
@elolos 我添加了 UnitOfWork 代码
-
似乎没有为
mockContext设置SaveChanges方法。不过,鉴于您注入了一个模拟上下文,我不明白为什么会有任何东西保存在数据库中。UnitOfWork中的代码看起来也不错。
标签: c# entity-framework unit-testing moq