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

时间:2016-08-10 06:17:07

标签: c# unit-testing rhino-mocks

我开始研究犀牛嘲笑并遇到了复杂的问题。

我依赖于AppDefaults类,它具有数据类型为Dictionary的readonly属性“Properties”。

My Class in 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);
    }
}

2 个答案:

答案 0 :(得分:0)

除了模拟.ContainsKey方法之外,为什么不直接使用预定义的值填充字典进行测试:

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

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

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

答案 1 :(得分:0)

我不会曝光

AppDefaults.Properties

字段。 而不是你可以添加像

这样的方法
GetProperty(string key) 

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