【发布时间】:2018-08-15 18:48:01
【问题描述】:
我正在使用 Xunit 和 Moq。我希望能够模拟插入到表中。这样记录实际上不会填充表,但单元测试可以验证插入是否成功。使用真实的 DbContext,单元测试适用于下面的方法 Add_Works()。当我尝试在 Add_WantToWork() 中模拟时,我收到错误消息“对象引用未设置为对象的实例。”失败发生在 ARepository 类中的 Context.Set().Add(entity) 上,如下所示。它由 uw.Table1.Add(_table1) 调用。
public class UnitTestClass
{
private readonly Table1 _table1 = new Table1()
{
TypeId = 4,
Name = "TestAutomation",
Description = "Test Automation",
CreatedDate = DateTime.Now
};
[Fact]
public void Add_Works()
{
int rowsAffected = 0;
using (var uw = new UnitOfWork(new PortalDbContext()))
{
uw.Table1.Add(_table1);
rowsAffected = uw.Commit();
}
Assert.Equal(1, rowsAffected);
}
[Fact]
public void Add_WantToWork()
{
int rowsAffected = 0;
var mockContext = new Mock<TestDbContext>();
using (var uw = new UnitOfWork(mockContext.Object))
{
uw.Table1.Add(_table1);
rowsAffected = uw.Commit();
}
Assert.Equal(1, rowsAffected);
}
}
public abstract class ARepository<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey>
{
protected readonly DbContext Context;
protected ARepository(DbContext context)
{
Context = context;
}
public void Add(TEntity entity)
{
Context.Set<TEntity>().Add(entity);
}
}
【问题讨论】:
-
如果您使用的是 EntityFramework,您应该能够找到一些允许您模拟 DBContext 的库。
-
我可以模拟 DbContext。我的问题是当我尝试将对象添加到模拟的 DbContext 时。
标签: c# unit-testing entity-framework-6 moq xunit