尝试模拟 Entity Framework 上下文时抛出 TargetInvocationException
TargetInvocationException thrown when trying to mock Entity Framework context
在使用 Moq 和 NUnit 为存储库编写单元测试时(在 this tutorial 之后),我遇到了 TargetInvocationException,我不知道为什么会抛出它。
var fooList = new List<Foo>
{
new Foo() { Id = 1, Name = "Something" },
new Foo() { Id = 2, Name = "Some other thing" }
}.AsQueryable();
var mockedFooSet = new Mock<DbSet<Foo>>(fooList);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.Provider).Returns(fooList.Provider);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.Expression).Returns(fooList.Expression);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.ElementType).Returns(fooList.ElementType);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.GetEnumerator()).Returns(fooList.GetEnumerator());
var mockedContext = new Mock<FooContext>();
mockedContext.Setup(context => context.Foos).Returns(mockedFooSet.Object);
在最后一行抛出 TargetInvocationException。我在这里错过了什么吗?我将如何解决这个问题?如果有人能给我解释一下我在这里做错了什么,我将不胜感激。
编辑: 错误信息
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.TypeInitializationException : The type initializer for 'Castle.Proxies.DbSet`1Proxy' threw an exception.
----> System.ArgumentException : Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
Foos 是一个属性;使用 mockedContext.SetupGet(c=>c.Foos).Return…
.
原来有一些错误的 DLL 引用。完全删除 Moq 并通过 Nuget 重新安装解决了这个问题。
对我来说,将 Moq 版本 4.0.10827 更新到 4.10.1 后,问题就消失了。
我是在尝试了相同的教程后才遇到这个问题的,在该教程中我也遇到了相同的 TypeInitializationException
和 ArgumentException
。
看了一些其他的回答,发现我安装的是v4.0.10827
我更新到最新版本(在撰写本文时为 v4.16.0.0)。更新后我不再看到异常。
在使用 Moq 和 NUnit 为存储库编写单元测试时(在 this tutorial 之后),我遇到了 TargetInvocationException,我不知道为什么会抛出它。
var fooList = new List<Foo>
{
new Foo() { Id = 1, Name = "Something" },
new Foo() { Id = 2, Name = "Some other thing" }
}.AsQueryable();
var mockedFooSet = new Mock<DbSet<Foo>>(fooList);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.Provider).Returns(fooList.Provider);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.Expression).Returns(fooList.Expression);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.ElementType).Returns(fooList.ElementType);
mockedFooSet.As<IQueryable<Foo>>().Setup(m => m.GetEnumerator()).Returns(fooList.GetEnumerator());
var mockedContext = new Mock<FooContext>();
mockedContext.Setup(context => context.Foos).Returns(mockedFooSet.Object);
在最后一行抛出 TargetInvocationException。我在这里错过了什么吗?我将如何解决这个问题?如果有人能给我解释一下我在这里做错了什么,我将不胜感激。
编辑: 错误信息
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.TypeInitializationException : The type initializer for 'Castle.Proxies.DbSet`1Proxy' threw an exception.
----> System.ArgumentException : Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
Foos 是一个属性;使用 mockedContext.SetupGet(c=>c.Foos).Return…
.
原来有一些错误的 DLL 引用。完全删除 Moq 并通过 Nuget 重新安装解决了这个问题。
对我来说,将 Moq 版本 4.0.10827 更新到 4.10.1 后,问题就消失了。
我是在尝试了相同的教程后才遇到这个问题的,在该教程中我也遇到了相同的 TypeInitializationException
和 ArgumentException
。
看了一些其他的回答,发现我安装的是v4.0.10827
我更新到最新版本(在撰写本文时为 v4.16.0.0)。更新后我不再看到异常。