AutoFixture, xUnit: настройка TypeRelays и внедрение службы в конструкторе

Пытаюсь написать тесты, использую xUnit.net, Moq, AutoFixture. Мне нужно внедрить службу в мой тестовый метод:

[Theory, AutoData]
public void TestSmthCool(IService service)
{
}

У IService есть 3 зависимости, которые я хочу высмеять. Но если я запускаю тест, я получаю сообщение об ошибке:

AutoFixture was unable to create an instance from Services.Interfaces.IService because it's an interface.

Итак, я исправил это следующим образом:

[Theory, AutoData]
public void TestSmthCool()
{
   var fixture = new Fixture();
   fixture.Customize(new AutoMoqCustomization());
   fixture.Customizations.Add(
      new TypeRelay(
         typeof(IService),
         typeof(MyService)
      )
   );

   var s= fixture.Create<IService>();
}

Но как настроить TypeRelay для всех тестов и внедрить сервис через конструктор метода?


person user348173    schedule 27.09.2017    source источник


Ответы (1)


Если вы хотите использовать MyService вместо IService, вам не нужно AutoMoqCustomization; то есть этот тест проходит:

[Fact]
public void TestSmthCool()
{
    var fixture = new Fixture();
    fixture.Customizations.Add(
        new TypeRelay(
            typeof(IService),
            typeof(MyService)
        )
    );

    var s = fixture.Create<IService>();

    Assert.IsAssignableFrom<MyService>(s);
}

Если вы хотите автоматизировать это, вы можете сначала упаковать TypeRelay в ICustomization:

public class MyServiceCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(
           new TypeRelay(
              typeof(IService),
              typeof(MyService)));
    }
}

Затем создайте атрибут, производный от AutoDataAttribute:

public class MyServiceAutoDataAttribute : AutoDataAttribute
{
    public MyServiceAutoDataAttribute() :
        base(new Fixture().Customize(new MyServiceCustomization()))
    {
    }
}

Затем вы можете использовать это во всех своих тестах:

[Theory, MyServiceAutoData]
public void CustomizedAutoDataBasedTest(IService s)
{
    Assert.IsAssignableFrom<MyService>(s);
}

В общем, я склонен создавать код CompositeCustomization для всей базы, который я применяю без разбора ко всем тестам.

person Mark Seemann    schedule 27.09.2017
comment
Выглядит то, что мне нужно, спасибо. - person user348173; 27.09.2017