如何从数据类型为字典的只读 属性 中模拟或存根方法?
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 的值。
我开始使用 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 的值。