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

本文关键字:字典 只读属性 方法 数据类型 存根 何模拟 模拟 | 更新日期: 2023-09-27 18:01:42

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

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

My Class under test使用Dictionary函数的结果。containskey()返回一个布尔值。

MyAppDefaultsInstance.Properties.ContainsKey (DefaultKey)

我只是通过在被测类上创建一个公共虚函数来包装. 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(如果键存在,它将返回键,以此类推),并在单元测试中模拟它的结果。mock方法将返回您将检查目标的值。TheDefaultSize