我开始研究犀牛嘲笑并遇到了复杂的问题。
我依赖于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);
}
}
答案 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 的值。