Rod*_*rez 28 c# testing entity-framework moq
以下使用EF 4.2的测试现在抛出EF 4.3的下一个异常
System.ArgumentException:类型为mock必须是接口或抽象或非密封类.----> System.TypeLoadException:来自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'的类型'Castle.Proxies.DbContext43Proxy'上的方法'CallValidateEntity'正在覆盖从中看不到的方法那个集会.
[Test]
public void CanCreateMoqTest()
{
// Arrange
Mock<DbContext43> mock;
// Act
mock = new Mock<DbContext43>();
// Assert
Assert.NotNull(mock.Object);
}
public class DbContext43:DbContext
{
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?为我的DbContext43创建一个界面?
这是4.2和4.3之间的突破性变化吗?
谢谢!!
Art*_*ers 38
谢谢你找到了这个.问题是由我们从EF 4.2版本中删除但留给EF 4.3的InternalsVisibleTo属性引起的.这允许Moq(我们用于测试)查看EntityFramework.dll的内部.但是,由于您的程序集无法看到这些内部结构,因此您最终会遇到异常.
我们计划在接下来的几周内对EF 4.3进行补丁发布,并将在此版本中剥离InternalsVisibleTo,然后再进行模拟.
更新:现在已在今天发布的EF 4.3.1(和EF 5.0-beta1)中修复.更新您的NuGet包以获得修复.有关详细信息,请参见http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx.
这种异常通常表示您尝试覆盖的成员未作为给定程序集中公共接口的一部分公开(或者更准确地说 - 覆盖程序集看不到它).如果我们看一下CallValidateEntity
EntityFramework 4.3 中的实现:
internal virtual DbEntityValidationResult CallValidateEntity(
DbEntityEntry entityEntry, IDictionary<object, object> items)
{
return this.ValidateEntity(entityEntry, items);
}
Run Code Online (Sandbox Code Playgroud)
我们确实注意到这个方法是internal
,因此属于不可覆盖的类别(考虑到没有使用属性,不可覆盖InternalsVisibleTo
).这通过适当的元数据输入自然匹配:
Method #20 (06000a03)
-------------------------------------------------------
MethodName: CallValidateEntity (06000A03)
Flags : [Assem] [Virtual] [HideBySig] [NewSlot] (000003c3)
Run Code Online (Sandbox Code Playgroud)
目前还不清楚为什么Moq试图覆盖那个成员......考虑到它不应该首先看到它.
在接口中包装您的上下文并仅公开您实际使用的方法是一个可行的选择 - 它应该足以让您的测试通过.