Если я правильно понимаю вашу ситуацию, вы не сможете исправить конструктор, чтобы использовать правильную модель DI, и вы не можете обойти это. Предполагая, что у вас есть действительный экземпляр IProxy
, который вы можете внедрить, чтобы должным образом удовлетворить конструкцию объекта, вы можете обратиться к некоторым грязным рефлексиям, чтобы получить свой IProcessor
макет.
Что-то вроде этого должно позволить вам установить поле после того, как вы построили свой sut.
// Arrange
var sut = SutProvider.GetATypeController(); // A system under test factory.
var mock = new Mock<IProcessor>();
// ... mock setup ..
typeof(ATypeController)
.GetField("_domain", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(sut, mock.Object);
// Act
var result = sut.Get();
// Assert
// ... assertions of result
Это не идеальная установка, но при работе с унаследованным кодом вам иногда придется делать грязные вещи, чтобы установить правильное состояние объекта для тестирования. Я настоятельно рекомендую вам хранить эти вещи только внутри тестов, с соответствующими комментариями о том, чтобы никогда не делать это в «реальном» коде.
SutProvider - простая фабрика, реализация может выглядеть так:
public class SutProvider
{
public static ATypeController GetATypeController() => new ATypeController(GetProxy(), GetATypeControllerLogger());
public static IProxy GetProxy() {
// Either return a valid IProxy, or set up a mock that can return a result from the GetProxy method that is valid enough to withstand InstitutionAddressProcessor's constructor.
}
public static ILogger<ATypeController> GetATypeControllerLogger() => new Mock<ILogger<ATypeController>>().Object;
}
Скорее всего, вам понадобится немного погрузиться в конструктор InstitutionAddressProcessor
, чтобы найти лучший способ передать ему достаточно действительный прокси.