我正在为我的Generic Repository图层编写单元测试,但我在DbEntityEntry
时遇到了一些问题。
我的更新方法如下所示。
public virtual void Update(TEntity entityToUpdate) {
var entity = dbSet.Find(context.Entry<ITrackedEntity>(entityToUpdate).Entity.Id);
context.Entry(entity).CurrentValues.SetValues(entityToUpdate);
}
如您所见,调用者调用context.Entry<TEntity>(TEntity entity)
方法。因此,在单元测试时,此代码会抛出null异常。
我曾试图模仿context.Entry
方法,但我不能,因为我无法提供返回值。
我目前的测试方法如下
[Fact]
public void UpdateTest() {
AssetType _sample1 = new AssetType() {
AssetTypeID = 1,
IsContainer = true,
Name = "Sample 1"
};
IDbSet<AssetType> assetTypeDbSet = new FakeDbSet<AssetType>(_sample1);
Mock<IDbContext> mockContext = new Mock<IDbContext>();
mockContext.Setup(pc => pc.Set<AssetType>()).Returns(assetTypeDbSet);
_sample1.Name = "Sample 1.1";
var dbEntity = mockContext.Object.Entry<ITrackedEntity>(_sample1);
mockContext.Setup(p => p.Entry<ITrackedEntity>(It.IsAny<AssetType>())).Returns(dbEntity);
using(GenericRepository<AssetType> repo = new GenericRepository<AssetType>(mockContext.Object)) {
repo.Update(_sample1);
var result = repo.GetAll(0, 0);
Assert.Equal(1, result.Count);
var singleResult = repo.GetByID(1);
Assert.Equal(_sample1.Name, singleResult.Name);
}
}
我尝试通过在测试时调用DbEntityEntry
方法来获取context.Entry<>()
值,但是wa也返回null
。
此类也不能与new
运算符相关联。所以我坚持了..
答案 0 :(得分:2)
单元测试此代码有什么意义?你伪造了Find
方法,然后假冒DbEntityEntry
并且没有真正的逻辑可以测试。
无论如何,EF代码通常不是单元可测试的。这是人们相信存储库将帮助他们的一个原因,因为他们在测试上层时模拟/伪造他们的存储库。然后使用集成测试对存储库进行测试,以确保EF和数据库中的所有内容都按预期工作。
你不会用Moq伪造DbEntityEntry
。也许使用TypeMock Isolator或MS Fakes,你可以做更多,但在你的示例代码中不需要它。