- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的通用存储库层编写单元测试,但我遇到了一些关于 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/
紧随我的另一个question about mocking DbContext.Set的脚步我还有一个关于模拟 EF Code First 的问题。 我现在有一个更新方法,如下所示: if (enti
在 Entity Framework 6 中,DbEntityEntry 中的某些信息可以通过调用 Property 来检索。但是,当属性不是属性而是集合或引用时,此操作会失败并出现 Argument
我正在尝试使用 Entity Framework 在保存时创建任何更改的审核日志。到目前为止,它运行良好,使用以下代码存储对每个字段所做的所有更改: foreach (string propertyN
我有以下辅助方法,它从 DbEntityValidationException 中提取验证消息。我们需要这个,因为默认情况下验证的细节不会添加到异常中。 public static string Lo
我正在从网上找到的代码片段中编写审计跟踪。在调用我的 SaveChanges 函数时,我会遍历所有在上下文中注册的修改过的实体,并从它们的更改中构建日志条目。 foreach (DbEntityEnt
我正在尝试根据这篇文章 http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tra
我正在为我的通用存储库层编写单元测试,但我遇到了一些关于 DbEntityEntry 的问题. 我的更新方法如下。 public virtual void Update(TEntity entit
简单:如何从 DbEntityEntry 对象中获取映射的表名?我在一个扩展 DbContext 的类中。我看过 ObjectContext 的示例,但不适用于 CF。 谢谢。 最佳答案 如另一个答案
我有以下在 EF7 之前使用的界面。当我尝试使用 EF7 构建应用程序时,我收到以下错误,而且我似乎无法在任何地方找到这种类型。我非常感谢您就如何为 EF7 更改此代码提出建议。 Error CS02
我正在使用 EF6。生成的代码类似于: public partial class MyDataContext : DbContext { public MyDataContext() : ba
难道我不能使用 DbEntityEntry 的复杂属性方法或属性方法来获取 EntityKey 对象吗?我找不到任何示例 MSDN ,但我认为这在 Entity Framework 5 中是可能的。我
这个代码狙击手来自 Adding CreatedDate to an entity using Entity Framework 5 Code First public overrid
我正在 EF6 中使用新的测试替身,如概述 here from MSDN .带有最小起订量和 nUnit 的 VS2013。一切都很好,直到我不得不做这样的事情: var myFoo = contex
这个问题是关于这段代码的: entityEntry.Property("WhateverProperty").CurrentValue = 1; 我回答了this question昨天,如果您在问题的
我正在使用以下代码使用从我的代码中收集的新信息更新实体对象。我正在使用 Entity Framework 5。 我使用以下扩展方法(作为我过去在 EF4 中使用的重新附加代码的替代方法): publi
在 EF 4.1+ 中,这两行代码之间有区别吗? dbContext.SomeEntitySet.Add(entityInstance); dbContext.Entry(entityInstance
我正在尝试使用 DbEntityEntry.CurrentValues.SetValues() 方法来促进使用来自非实体 DTO 的值更新现有实体(参见:http://blogs.msdn.com/b
我是一名优秀的程序员,十分优秀!