У меня есть класс 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 параметров! (Не смотри на меня так, это устаревший код, который был передан мне ?
) Это одна из главных причин, почему AutoFixture так здорово сэкономил время, пытаясь получить этоКод контролируется побитно.
В MyServiceTest.TestCaseN
я ожидал, что SUT получит смоделированную зависимость, но, несмотря ни на что, он всегда получает экземпляр ConcreteDependency
.
Isесть ли способ настроить AutoFixture для подачи mockDependency
в SUT без , когда мне придется создавать все вручную?