【发布时间】:2015-09-13 20:05:45
【问题描述】:
我正在尝试理解单元测试中的模拟并将单元测试过程集成到我的项目中。所以我一直在浏览几个教程并重构我的代码以支持模拟,无论如何,我无法通过测试,因为我试图测试的数据库方法正在使用事务,但是在创建事务时,我得到了
底层提供程序在打开时失败。
没有事务一切正常。
我目前拥有的代码是:
[TestMethod]
public void Test1()
{
var mockSet = GetDbMock();
var mockContext = new Mock<DataContext>();
mockContext.Setup(m => m.Repository).Returns(mockSet.Object);
var service = new MyService(mockContext.Object);
service.SaveRepository(GetRepositoryData().First());
mockSet.Verify(m => m.Remove(It.IsAny<Repository>()), Times.Once());
mockSet.Verify(m => m.Add(It.IsAny<Repository>()), Times.Once());
mockContext.Verify(m => m.SaveChanges(), Times.Once());
}
// gets the DbSet mock with one existing item
private Mock<DbSet<Repository>> GetDbMock()
{
var data = GetRepositoryData();
var mockSet = new Mock<DbSet<Repository>>();
mockSet.As<IQueryable<Repository>>().Setup(m => m.Provider).Returns(data.Provider);
// skipped for brevity
return mockSet;
}
被测代码:
private readonly DataContext _context;
public MyService(DataContext ctx)
{
_context = ctx;
}
public void SaveRepositories(Repository repo)
{
using (_context)
{
// Here the transaction creation fails
using (var transaction = _context.Database.BeginTransaction())
{
DeleteExistingEntries(repo.Id);
AddRepositories(repo);
_context.SaveChanges();
transaction.Commit();
}
}
}
我也试图模拟交易部分:
var mockTransaction = new Mock<DbContextTransaction>();
mockContext.Setup(x => x.Database.BeginTransaction()).Returns(mockTransaction.Object);
但这不起作用,失败:
非虚拟(在 VB 中可覆盖)成员上的设置无效:conn => conn.Database.BeginTransaction()
有什么办法解决这个问题吗?
【问题讨论】:
标签: c# entity-framework unit-testing testing moq