如何模拟或存根数据类型为字典的只读属性中的方法
本文关键字:字典 只读属性 方法 数据类型 存根 何模拟 模拟 | 更新日期: 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 。