Stub/Mock 2 уровня вниз в классе
У меня есть провайдер настроек, который невозможно проверить (корпоративный устаревший код). Я пытаюсь обернуть провайдера настроек в хранилище настроек, чтобы уменьшить объем непроверяемого кода. Таким образом, вместо 20 методов, использующих поставщика настроек, у нас будет вместо 1. Остальные реализуют интерфейс Settings Repository.
Однако после этого у меня возникают проблемы с проведением тестов, что обычно указывает на то, что я сделал что-то не так.
Я надеюсь, что вы можете помочь узнать, что.
public class SettingsRepository : ISettingsRepository
{
public SettingsRepository() {Settings = Settings.Default; }
public Settings Settings { get; set; }
}
public interface ISettingsRepository
{
Settings Settings { get; set; }
}
Я использую единство, чтобы ввести хранилище. Я получаю что-то из хранилища следующим образом:
_settingsRepository.Settings.SecureCache
Так вот в чем проблема. Я могу смоделировать / заглушить интерфейс Settings Repository, используя nsubstitute, но на самом деле мне нужно смоделировать "Настройки" для настройки возврата SecureCache.
Есть ли способ "глубокого издевательства" в nsubstitute, чтобы я мог сделать что-то вроде:
_settingsRepository.Settings.SecureCache.Returns("www.somepath.com");
В настоящее время "настройки" являются нулевыми, и у меня нет ничего, что я могу высмеять там.
Мое резервное решение состоит в том, чтобы добавить все поля настроек непосредственно в Settings Repository, но я бы хотел избежать этого, поскольку он просто переместит непроверяемый код в другое место решения.
1 ответ
Используя NSubstitue (версия 1.5.0.0), вы можете сделать, как показано ниже. Вы можете создать экземпляр настроек (или вы даже можете создать поддельный экземпляр), а затем вернуть поддельный SecureCache, как показано ниже.
public class SettingsRepository : ISettingsRepository {
public SettingsRepository() { Settings = Settings.Default; }
public Settings Settings { get; set; }
}
public interface ISettingsRepository {
Settings Settings { get; set; }
}
public class Settings {
public Settings Default { get; set; }
public string SecureCache { get; set; }
}
[TestFixture]
public class TestClass
{
[Test]
public void Subject_Scenario_Expectation()
{
var repoStub = Substitute.For<ISettingsRepository>();
repoStub.Settings.Returns(new Settings() { SecureCache = "www.somepath.com" });
Assert.IsNotNull(repoStub.Settings);
Assert.IsNotNull(repoStub.Settings.SecureCache);
}
}