AutoFixture/AutoMoq: 无法创建实例(`BadImageFormatException`)
AutoFixture/AutoMoq: Unable to Create Instance (`BadImageFormatException`)
下面是我目前遇到的问题的一个最小示例:
using System.Net.WebSockets;
using AutoFixture;
using AutoFixture.AutoMoq;
using FluentAssertions;
using Xunit;
...
[Fact]
public void Test1()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = fixture.Create<WebSocket>();
sut.Should().NotBeNull();
}
[Fact]
public void Test2()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = new Mock<WebSocket>().Object;
fixture.Inject(sut);
sut.Should().NotBeNull();
}
...
当我 运行 第一次测试时,我得到以下异常:
AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from Moq.Mock`1[System.IO.Stream] because creation unexpectedly failed with exception. Please refer to the inner exception to investigate the root cause of the failure.
Inner exception messages:
System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
第二次测试成功。
我希望能够使用 AutoFixture 创建一个 class 的实例,它将 WebSocket
作为构造函数参数,而不需要先注入模拟对象(最终,所以我可以使用 AutoMoqData
属性,并摆脱一些样板文件)。我在这里有任何误用或误解,还是将其作为 GitHub 问题更好?在此期间,我能做些什么来解决这个问题吗?
您发现此问题是因为 AutoFixture 的工厂发现策略。当您尝试创建一个抽象类型的对象时,AutoFixture 仍然会检查该类型以找到一个静态工厂方法来激活该对象。在您的特定情况下, WebSocket
类型包含此类方法,因此使用了其中一些方法。它似乎不能很好地处理自动生成的输入值,因此失败并出现异常。
您可以自定义 AutoFixture,以始终模拟 WebSocket
类型:
fixture.Register((Mock<WebSocket> m) => m.Object);
刚刚使用最新版本的产品(AutoFixture 4.5.0
、Moq 4.10.0
)进行了测试,效果非常好。
下面是我目前遇到的问题的一个最小示例:
using System.Net.WebSockets;
using AutoFixture;
using AutoFixture.AutoMoq;
using FluentAssertions;
using Xunit;
...
[Fact]
public void Test1()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = fixture.Create<WebSocket>();
sut.Should().NotBeNull();
}
[Fact]
public void Test2()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = new Mock<WebSocket>().Object;
fixture.Inject(sut);
sut.Should().NotBeNull();
}
...
当我 运行 第一次测试时,我得到以下异常:
AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from Moq.Mock`1[System.IO.Stream] because creation unexpectedly failed with exception. Please refer to the inner exception to investigate the root cause of the failure.
Inner exception messages:
System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
第二次测试成功。
我希望能够使用 AutoFixture 创建一个 class 的实例,它将 WebSocket
作为构造函数参数,而不需要先注入模拟对象(最终,所以我可以使用 AutoMoqData
属性,并摆脱一些样板文件)。我在这里有任何误用或误解,还是将其作为 GitHub 问题更好?在此期间,我能做些什么来解决这个问题吗?
您发现此问题是因为 AutoFixture 的工厂发现策略。当您尝试创建一个抽象类型的对象时,AutoFixture 仍然会检查该类型以找到一个静态工厂方法来激活该对象。在您的特定情况下, WebSocket
类型包含此类方法,因此使用了其中一些方法。它似乎不能很好地处理自动生成的输入值,因此失败并出现异常。
您可以自定义 AutoFixture,以始终模拟 WebSocket
类型:
fixture.Register((Mock<WebSocket> m) => m.Object);
刚刚使用最新版本的产品(AutoFixture 4.5.0
、Moq 4.10.0
)进行了测试,效果非常好。