Конструктор с несколькими экземплярами одного типа

У меня есть класс с конструктором, как это:

MyClass(MySetting, IMyService, IMyService, IMyService)

Как я могу использовать AutoFixture для создания MyClass в этом случае? Я знаю когда у него только один IMyService Param, мы можем использовать AutoMoq для Freeze издеваться, но в этом случае я не уверен, что мы можем Freeze три насмешки, потому что я думаю, что последний будет использоваться для всех трех параметров.

1 ответ

Решение

Действительно, если вы Freeze объект, вы будете получать один и тот же объект каждый раз, когда просите его; в этом суть Freeze,

Что я обычно делаю в такой ситуации, так это добавляю Inspection Properties в класс, потому что то, что вы создаете, вы также можете выставить:

public class MyClass
{
    public MyClass(
        MySetting setting,
        IMyService service1,
        IMyService service2,
        IMyService service3)
    {
        this.Service1 = service1;
        this.Service2 = service2;
        this.Service3 = service3;
    }

    public IMyService Service1 { get; }
    public IMyService Service2 { get; }
    public IMyService Service3 { get; }

    public string DoIt()
    {
        return
            this.Service1.Whatever() +
            this.Service2.Whatever() +
            this.Service3.Whatever();
    }
}

Ты можешь использовать Mock.Get чтобы получить Mock для каждого введенного сервиса, как показано в этом тесте:

[Fact]
public void AskTheSut()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var sut = fixture.Create<MyClass>();
    Mock.Get(sut.Service1).Setup(s => s.Whatever()).Returns("foo");
    Mock.Get(sut.Service2).Setup(s => s.Whatever()).Returns("bar");
    Mock.Get(sut.Service3).Setup(s => s.Whatever()).Returns("baz");

    var actual = sut.DoIt();

    Assert.Equal("foobarbaz", actual);
}

На касательной ноте, в качестве принципа проектирования я бы сказал, что с одной зависимостью все в порядке, две из одной и той же зависимости иногда могут быть уместны, но если у вас их три, вам следует рассмотреть возможность их набора вместо этого. (Раз, два, много...)

Другие вопросы по тегам