【问题标题】:Moles to mock an indexed property模拟索引属性的摩尔
【发布时间】:2011-06-30 11:50:00
【问题描述】:

我正在寻找一种使用 Moles 来“绕过”配置文件中的单个项目的方法。我可以这样做:

         NameValueCollection appsettings = new NameValueCollection();
         appSettings.Add("MyKey", "MyValue");
         System.Configuration.Moles.MConfigurationManager.AppSettingsGet = () => this.appSettings;

这很好用,但是我尝试测试的类使用了一些其他配置设置,包括 ConfigSections 和 Moles detour 似乎打破了这一点。我只想替换一个特定的值,而不是整个部分。在 TypeMock 中,我可以这样做:

Isolate.WhenCalled(() => ConfigurationManager.AppSettings["MyKey"]).WithExactArguments().WillReturn("MyValue");

当我使用 TypeMock 模拟 configurationManager 时,我的测试通过了,但是当我使用 Moles 版本(看起来它应该做同样的事情)时它失败了,这意味着 Moles 必须以 TypeMock 不影响的方式影响 ConfigurationManager 类不。

任何关于我如何使用痣以按照 TypeMock 的方式行事的帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个版本的 Moles?是偶然的 v0.94.51023.0 吗?该版本和 ConfigurationManager 存在问题。您是否尝试过使用 v0.94.51006.1?
  • 谢谢马特,我确实在使用 0.94.51023.0。我已尝试获取 51006.1,以便查看该版本中是否存在问题,但无法在任何地方找到下载。我现在设法将我的问题缩小到静态构造函数。 Moles 在实例成员中正确地模拟了 ConfigurationManager,但是当从静态构造函数调用 ConfigurationManager 时,Moles 没有正确地模拟它。我已经针对这个问题发布了一个单独的帖子:stackoverflow.com/questions/6015173/…

标签: mocking appsettings configurationmanager moles typemock


【解决方案1】:
  1. 复制当前 app.settings 部分:

    NameValueCollection appSettings = new NameValueCollection(ConfigurationManager.AppSettings);
    
  2. 通过调用 Set/Add 函数修改您需要的部分 (请记住,“Add”函数不会覆盖现有值,但它会为键添加新值。另一方面,“Set”总是创建一个新条目并删除现有值):

    appSettings.Set("key name", "new value");
    
  3. 创建委托:

    MConfigurationManager.AppSettingsGet =
      () =>
      {
        return appSettings;
      };
    

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多