我有一个TestFixture
类,可以在当前项目中练习一些代码。在大多数情况下,我会将某些依赖项的实际,具体实现提供给SUT。但是,我遇到了一个不希望使用真实事物的情况。由于我使用自定义AutoDataAttribute
创建SUT,因此除非我手动创建所有详细信息,否则现在似乎已经失去了将所需的依赖项替换为模拟对象的能力。
SUT通过构造函数注入获得所有依赖关系:
public class MyService { private readonly IDependency dependency; public MyService(IDependency dependency, ...) { ... this.dependency = dependency ?? throw new ArgumentNullException(); ... } }
这是我的测试类的样子:
[TestFixture] public class MyServiceTest { [Test, CustomAutoMock] public void TestCase1(int id, MyService sut) { ... sut.Dependency.Configure( ... ); ... sut.DoSomethingWith(id); ... } [Test, CustomAutoMock] public void TestCase2(string searchString, MyService sut) { ... sut.Dependency.Configure( ... ); ... sut.FindSomethingMatching(searchString); ... } ... [Test, CustomAutoMock] public void TestCaseN([Frozen] Mock<IDependency> mockDependency, MyService sut) { ... mockDependency.SetUp(o => o.DoSomething()).Throws<InvalidOperationException>(); ... sut.Exercise(); ... } }
这是CustomAutoMockAttribute:
代码class CustomAutoMockAttribute : AutoDataAttribute { public CustomAutoMockAttribute() : base(InitializeCustomFixture) { } public static Fixture InitializeCustomFixture() { var fixture = new Fixture(); fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true }); ... fixture.Register<IDependency>(() => fixture.Create<ConcreteDependency>()); ... return fixture; } }
实际上
MyService
的构造函数需要18个参数! (不要这样看我,这是被传递给我的[[legacy
🙁
)。这就是AutoFixture如此省时省力的主要原因之一。控制一点一点。在MyServiceTest.TestCaseN
中,我希望SUT能够获得模拟的依赖关系,但是无论如何,它总是会获得ConcreteDependency
的实例。有什么方法可以配置AutoFixture将mockDependency
馈送到SUT中?[[无
我有一个TestFixture类,可以在当前项目中执行一些代码。在大多数情况下,我会将某些依赖项的实际,具体实现提供给SUT。但是,我遇到了一个...