AutoFixture / AutoMoq:无法创建实例(“ BadImageFormatException”)

时间:2018-09-04 23:45:29

标签: moq autofixture automoq

以下是我当前遇到的问题的一个最小示例:

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创建一个类的实例,该类将WebSocket作为构造函数参数,而无需首先注入模拟对象(最终,我可以使用{ {1}}属性,并删除一些样板)。我在这里是否有任何误用或误解,还是将它作为GitHub问题更好地解决?在此期间,我有什么办法可以解决此问题?

1 个答案:

答案 0 :(得分:2)

由于AutoFixture的工厂发现策略,您会发现此问题。当您尝试创建抽象类型的对象时,AutoFixture仍会检查该类型以找到静态工厂方法来激活该对象。在您的特定情况下,WebSocket类型包含此类方法,因此将使用其中一些方法。似乎不适用于自动生成的输入值,因此会失败并出现异常。

您可以自定义AutoFixture,以始终模拟WebSocket类型:

fixture.Register((Mock<WebSocket> m) => m.Object);

只需使用最新版本的产品(AutoFixture 4.5.0Moq 4.10.0)进行测试,它就可以像魅力一样发挥作用。