Насмешка над свойством, использующим индекс - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался отделить ConfigurationManager, чтобы я мог высмеять его.

Вот мой класс и интерфейс

public class Settings
{
    public string this[string index] => ConfigurationManager.AppSettings[index];
}

public class ConfigurationRepository : IConfigurationRepository
{    
    public virtual Settings AppSettings
    {
        get { return new Settings(); }
    }
}

public interface IConfigurationRepository
{
   Settings AppSettings { get; }
}

Вот как я это высмеиваю

_configurationManager = new Mock<IConfigurationRepository>();
_configurationManager.SetupGet(m => m.AppSettings["someKey"]).Returns("someResult");

Но когда я пытаюсь проверить это, я получаю исключение

Неверная настройка для не виртуального (переопределяемого в VB) члена: m => m.AppSettings ["someKey"]

И тест не пройден, он даже не проходит мимо моего Setup метода.

И я понятия не имею, почему я получаю это исключение, может кто-нибудь сказать мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 17 сентября 2018

Это свойство индексатора в конкретном Settings классе должно быть virtual, чтобы Moq мог переопределить поведение по умолчанию

public class Settings {
    public virtual string this[string index] => ConfigurationManager.AppSettings[index];
}

Я бы также предложил рефакторинг реализации репозитория, чтобы избежать инициализации класса каждый раз, когда вызывается свойство AppSettings.

public class ConfigurationRepository : IConfigurationRepository {
    private Lazy<Settings> settings = new Lazy<Settings>(() => new Settings());

    public virtual Settings AppSettings {
        get { return settings.Value; }
    }
}
...