AutoFixture / AutoMoq: невозможно создать экземпляр (`BadImageFormatException`) - PullRequest
0 голосов
/ 05 сентября 2018

Ниже приведен минимальный пример проблемы, с которой я сейчас сталкиваюсь:

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? Тем временем, я могу что-нибудь сделать, чтобы обойти эту проблему?

1 Ответ

0 голосов
/ 17 сентября 2018

Вы наблюдаете эту проблему из-за стратегии обнаружения фабрики AutoFixture. Когда вы пытаетесь создать объект абстрактного типа, AutoFixture по-прежнему проверяет тип, чтобы найти статический фабричный метод для активации объекта. В вашем конкретном случае тип WebSocket содержит такие методы, поэтому некоторые из них используются. Похоже, что он не работает хорошо с автоматически сгенерированными входными значениями, поэтому происходит сбой за исключением.

Вы можете настроить автофикс, чтобы всегда издеваться над типом WebSocket:

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

Только что протестировано с последними версиями продуктов (AutoFixture 4.5.0, Moq 4.10.0) и работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...