【问题标题】:AutoFixture/AutoMoq: Unable to Create Instance (`BadImageFormatException`)AutoFixture/AutoMoq:无法创建实例(`BadImageFormatException`)
【发布时间】:2018-09-04 23:45:29
【问题描述】:

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

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 作为构造函数参数,而无需先注入模拟对象(最终,这样我就可以使用 AutoMoqData属性,并去掉一些样板文件)。我在这里有任何误用或误解,还是将其作为 GitHub 问题更好?在此期间,我能做些什么来解决这个问题吗?

【问题讨论】:

    标签: moq autofixture automoq


    【解决方案1】:

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

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

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

    刚刚使用最新版本的产品(AutoFixture 4.5.0、Moq 4.10.0)进行了测试,效果非常好。

    【讨论】:

    • 您确定这解决了问题的根本原因吗?通常,BadImageFormatException 是由不兼容的程序集版本引起的。我希望这个问题可以通过程序集重定向来解决,但没有其他代码。你试过吗?
    • 老实说,我无法在本地重现原始问题,所以我不确定它到底为什么会发生 :-/ 我决定无论如何建议一个解决方案,只有当它发生时才返回问题再次。我的猜测是BadImageFormatException 也可能被Moq 抛出 - 当代理类型为一些棘手的系统类型生成时,后来由于它的一些问题而无法加载。
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多