我有一个类有这样的构造函数的类:
-1
在这种情况下,如何使用AutoFixture创建MyClass(MySetting, IMyService, IMyService, IMyService)
?我知道当它只有一个MyClass
参数时,我们可以使用AutoMoq来IMyService
一个模拟,但在这种情况下我不确定我们可以Freeze
三个模拟因为我认为最后一个将用于所有三个参数。
答案 0 :(得分:2)
的确,如果你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);
}
在切线上,作为一个设计原则我会说一个依赖是好的,两个相同的依赖也偶尔也是合适的,但是如果你有三个,你应该考虑改为使用它们的集合。 (一,二,多...... )