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);
    }
}
Другие вопросы по тегам