具有多个相同类型实例的构造函数
Constructor with more than one instance of same type
我有一个 class,其构造函数如下:
MyClass(MySetting, IMyService, IMyService, IMyService)
在这种情况下,如何使用 AutoFixture 创建 MyClass
?我知道当它只有一个 IMyService
参数时,我们可以使用 AutoMoq 到 Freeze
一个模拟,但在这种情况下我不确定我们可以 Freeze
三个模拟因为我认为最后一个将用于所有三个参数。
确实,如果您 Freeze
一个对象,您每次请求时都会得到相同的对象;这就是 Freeze
.
的重点
这种情况我通常做的是在class上加上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);
}
顺便说一句,作为一种设计原则,我会说一个依赖关系很好,两个相同的依赖关系有时也是合适的,但如果你有三个,你应该考虑使用它们的集合. (一个,两个,很多...)
我有一个 class,其构造函数如下:
MyClass(MySetting, IMyService, IMyService, IMyService)
在这种情况下,如何使用 AutoFixture 创建 MyClass
?我知道当它只有一个 IMyService
参数时,我们可以使用 AutoMoq 到 Freeze
一个模拟,但在这种情况下我不确定我们可以 Freeze
三个模拟因为我认为最后一个将用于所有三个参数。
确实,如果您 Freeze
一个对象,您每次请求时都会得到相同的对象;这就是 Freeze
.
这种情况我通常做的是在class上加上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);
}
顺便说一句,作为一种设计原则,我会说一个依赖关系很好,两个相同的依赖关系有时也是合适的,但如果你有三个,你应该考虑使用它们的集合. (一个,两个,很多...)