如何从数据类型为字典的只读 属性 中模拟或存根方法?

How do I mock or stub a method from a readonly property whose datatype is dictionary?

我开始使用 rhino 模拟,运行 遇到了一个复杂的问题。

我依赖于 class AppDefaults,它有一个只读的 属性 "Properties",数据类型为 Dictionary。

我的 Class 测试使用字典函数 .ContainsKey() 的结果,其中 returns 一个布尔值。

MyAppDefaultsInstance.Properties.ContainsKey("DefaultKey")

我只是通过在被测 class 上创建一个 public 虚函数来包装 .Contains 函数来解决这个问题。但是有没有一种方法可以模拟或存根 .ContainsKey 结果而无需包装器来模拟它?

示例代码:

    public class AppDefaults
{

    public readonly IDictionary<String, String> Properties = new Dictionary<string, string>();

    public AppDefaults()
    {
        LoadProperties();
    }

    private void LoadProperties()
    {
        //load the properties;
    }

    public virtual int GetPropertyAsInt(string propertyKey)
    {
        return XmlConvert.ToInt32(Properties[propertyKey]);
    }

}


public class DefaultManager
{
    AppDefaults _appsDefault;
    public int TheDefaultSize
    {
        get
        {
            int systemMax;
            int currentDefault = 10;

            if (_appsDefault.Properties.ContainsKey("DefaultKey"))
            {
                systemMax = _appsDefault.GetPropertyAsInt("DefaultKey");
            }
            else
            {
                systemMax = currentDefault;
            }

            return systemMax;
        }
    }

    public DefaultManager(AppDefaults appDef) {
        _appsDefault = appDef;
    }
}

[TestClass()]
public class DefaultManagerTest
{

    [TestMethod()]
    public void TheDefaultSizeTest()
    {
        var appdef = MockRepository.GenerateStub<AppDefaults>();

        appdef.Expect(m => m.Properties.ContainsKey("DefaultKey")).Return(true);

        appdef.Stub(app_def => app_def.GetPropertyAsInt("DefaultKey")).Return(2);

        DefaultManager target = new DefaultManager(appdef); 

        int actual;
        actual = target.TheDefaultSize;
        Assert.AreEqual(actual, 2);
    }
}

与其模拟 .ContainsKey 方法,不如用一些预定义的值填充字典来进行测试:

// arrange
var appDef = new AppDefaults();
appDef.Properties["DefaultKey"] = "2";

// act
var target = new DefaultManager(appDef); 

// assert
Assert.AreEqual(target.TheDefaultSize, 2);

我不会暴露

AppDefaults.Properties

字段。 取而代之的是,您可以添加

之类的方法
GetProperty(string key) 

到 AppDefaults(如果存在则 return 密钥等)并在单元测试中模拟它的结果。模拟方法将 return 您将检查 target.TheDefaultSize 的值。