我希望使用此处提供说明使用Entity Framework 6对某些方法进行单元测试。

我的设置略有不同 - 我也使用ASP.Net Identity(使用EF的默认实现)。 因此,我的上下文继承自IdentityDbContext。

当我运行测试时,我得到一个例外,其中包含以下详细信息:

Castle.Proxies.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.    
Castle.Proxies.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.    
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.    
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

我已经读过,在正常使用中,这些是在默认的OnModelCreating方法中设置的。

但是,有人可以提供有关在上面链接的方法中说明的模拟上下文中处理此问题的建议吗?

谢谢

安迪

===============>>#1 票数:0

正如那篇文章所指出的那样,当你模拟EF类型时,你会完全改变它们的行为:查询将作为LINQ-to-Objects而不是LINQ-to-SQL执行。 这意味着您可以轻松编写单元测试,以便在现实世界中使用时失败的代码。 一个很好的例子是:

context.Foos.Where(candidate => SomePredicate(candidate));

这意味着您需要完全理解有效的LINQ-to-SQL表达式来编写单元测试,但是您正在编写这些单元测试,因为您想要验证您的理解。 那真的给你买了什么? 你从这些单元测试中获得了多少价值? 我从一个曾经花了很多时间嘲笑我的EF层的人的角度来说这个,只是发现一旦数据库涉及到代码是错误的。

在我看来,更好的测试策略是创建Gateway类,充当DbContext与该上下文的消费者之间的中介。

class FooGateway : IFooGateway
{
    IEnumerable<Foo> GetFoosThatObeySomePredicate() { /* ... */ }
}

Gateway公开了可以有效模拟的接口。 在数据消耗类中使用这些接口,以便您可以编写高质量的单元测试,然后接受您需要编写集成测试来自己测试Gateway类:这些测试需要一个真实的数据库,因此您需要用于创建数据库的基础结构部分测试。

  ask by Andy Butland translate from so

未解决问题?本站智能推荐:

1回复

使用IdentityDbContext对Entity Framework 6进行单元测试

我目前正在使用以下MSDN教程在ASP.NET Web API 2.0应用程序中为Entity Framework 6操作添加单元测试: http://msdn.microsoft.com/en-us/data/dn314431 本教程建议创建一个接口来代替应用程序的DbContex
2回复

单元测试IdentityDbContext

我已经读到新的EF7允许在内存中存储,这使单元测试更加容易。 这在DbContext上效果很好,但是到目前为止,我遇到的问题是我使用的是IdentityDbContext,该选项没有附带该选项,或者到目前为止我还没有找到它。 我想要做的是将单元测试添加到我的AccountControll
1回复

在UseInMemoryDatabase()创建的IdentityDbContext中使用Identity的管理器

我制作了这种方法,使单元测试DbContext更加容易。 这种方法使我的db Context在内存中。 之所以有效,是因为我使用实体(例如_context.Projects , _context.Tests等,在单元测试中测试此方法)进行了测试: 我的DbContextClass看起
1回复

需要经过验证的用户的单元测试DAL

本质上,我想做的是测试某些操作,就像特定用户已登录并正在执行该操作一样。 我有一个在需要审计的实体上实现的接口 在我的MVC项目中,我覆盖了SaveChanges()函数,以便自动填写上面的字段: 这在所有情况下IAuditableEntity完美运行,因为您需要在修改任何IA
5回复

模拟新的Microsoft Entity Framework Identity UserManager和RoleManager

有没有人为UserManager和RoleManager提出成功的RoleManager解决方案? 我整天都在靠墙打我的头。 我想要做的就是模拟对象以使用内存集合而不是命中Entity Framework数据存储。 我已经浏览了互联网并尝试了几种使用MOQ的不同方法。 我的印象是新东
2回复

如何使用变量连接字符串创建IdentityDbContext?

拥有我自己的IdentityDbContext实现,我希望它能够根据用户的选择连接到自定义数据库。 所以我为默认数据库和用户选择的数据库创建了2个构造函数。 我现在的问题是将自定义connectionName引入类中的方式。 在此方法中调用构造函数: 使用会话变量是不可能
10回复

实体类型ApplicationUser不是当前上下文模型的一部分

我将根据本文从Identity 1.0.0迁移到Identity 2.0.1 并且生成的迁移代码与新的IdentityUser无关。 它不会添加新列。 因此,我做了一个新项目,然后再次尝试,但是迁移代码为空。 为了解决该问题,我直接在SQL Server中进行了编辑,然后在解
1回复

实体类型ApplicationUser不是当前上下文模型的一部分

我已经建立了一个新的asp.net网络表单应用程序。 我想使用我自己的实体框架数据模型,使用提供的owin身份验证创建登录并注册功能。 我已更改了默认值和IdentityModels.cs中的连接字符串,但是使用登录名时出现上述错误。 代码与默认值保持不变,当我将Applicati
2回复

如何使用Entity Framework访问与模型相关的属性? [关闭]

我正在开发一个简单的应用程序,它将允许用户创建配置文件并上传多个图像。 我正在使用ASP.NET Identity,因此将“用户”称为ApplicationUser 。 我有一个Image和一个ApplicationUser域模型,如下所示: 和 我添加了public vir
2回复

我想使用Entity Framework + ASP Identity,但我不希望EF为我生成表

我创建了新的ASP MVC 5应用程序(带有asp身份)。 我使用IdentityDbContext类将所有域对象放入其中。 当我第一次创建用户时,创建了所有数据库表(标识表),包括我的Country表。 但是现在我在数据库中添加了新表( 从Management Studio创建