我试图解耦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
方法。
我不知道为什么会出现这种异常,有人可以告诉我我在做什么错吗?
答案 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; }
}
}