模拟使用索引的属性

时间:2018-09-17 10:29:47

标签: c# unit-testing nunit moq

我试图解耦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 :(得分:1)

具体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; }
    }
}