gpt4 book ai didi

entity-framework-5 - 模拟 DbEntityEntry

转载 作者:行者123 更新时间:2023-12-04 07:55:01 26 4
gpt4 key购买 nike

我正在为我的通用存储库层编写单元测试,但我遇到了一些关于 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 启动此类。运算符(operator)。所以我卡住了..

最佳答案

对这段代码进行单元测试的意义何在?你伪造了 Find 方法,然后你伪造了 DbEntityEntry 并且没有真正的逻辑可以测试。

无论如何,EF 代码通常不可进行单元测试。这就是为什么人们相信存储库会帮助他们的原因之一,因为他们在测试上层时模拟/伪造他们的存储库。然后使用集成测试对存储库进行测试,以确保 EF 和数据库中的所有内容都按预期工作。

您不会用 Moq 伪造 DbEntityEntry。也许使用 TypeMock Isolator 或 MS Fakes 您将能够做更多的事情,但您的示例代码中不需要它。

关于entity-framework-5 - 模拟 DbEntityEntry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16038566/

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