Конструктор с несколькими экземплярами одного типа
У меня есть класс с конструктором, как это:
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);
}
На касательной ноте, в качестве принципа проектирования я бы сказал, что с одной зависимостью все в порядке, две из одной и той же зависимости иногда могут быть уместны, но если у вас их три, вам следует рассмотреть возможность их набора вместо этого. (Раз, два, много...)