我正在为一个看起来有点像这样的DataGridViewCell类编写单元测试(在VS2010中):
public class MyCell : DataGridViewCell
{
protected override object GetFormattedValue(object value, int rowIndex, ref System.Windows.Forms.DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.Windows.Forms.DataGridViewDataErrorContexts context)
{
return MyCustomFormatting(value);
}
private object MyCustomFormatting(object value)
{
var formattedValue = string.Empty;
// ... logic to test here
return FormattedValue;
}
}
我想测试公共属性.FormattedValue设置正确。但是,如果正在测试的单元格没有设置DataGridView,则它总是返回null(我使用Telerik的JustDecompile反射工具检查了这一点。)
我显然可以绕过这个并且只使用访问器来访问受保护或私有方法,但是在VS2012之后不再使用访问器。
如何在不使用访问器的情况下对此逻辑进行单元测试?
答案 0 :(得分:1)
因为很明显要设置DataGridViewCell
和DataGridView
,还有很多工作要做,为什么不尝试别的?< / p>
首先,创建一个执行特殊格式化的组件:
public class SpecialFormatter
{
public object Format(object value)
{
var formattedValue = string.Empty;
// ... logic to test here
return FormattedValue;
}
}
然后将其用于DataGridViewCell
实施:
public class MyCell : DataGridViewCell
{
protected override object GetFormattedValue(object value, int rowIndex, ref System.Windows.Forms.DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter valueTypeConverter, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.Windows.Forms.DataGridViewDataErrorContexts context)
{
return MyCustomFormatting(value);
}
private object MyCustomFormatting(object value)
{
return new SpecialFormatter.Format(value);
}
}
然后你继续进行单元测试SpecialFormatter
,然后你就完成了。除非您的DataGridViewCell
实施中还有其他许多内容,否则测试它的价值不大。
答案 1 :(得分:0)
我确实在MSDN Upgrading Unit Tests from Visual Studio 2010上找到了这个信息,在那里它解释了使用PrivateObject,如果由于某种原因,melike的答案不是一个选项。
尽管melike的回答对我有用,但我想我只是想知道它是如何工作的,这是一个示例测试,以防它对任何人都有帮助:
[TestMethod]
public void MyCellExampleTest()
{
var target = new MyCell();
var targetPrivateObject = new PrivateObject(target);
var result = targetPrivateObject.Invoke("MyCustomFormatting", new object[] { "Test" });
Assert.AreEqual(string.Empty, result);
}
使用PrivateObject的一个明显缺点是方法名称只是存储为字符串 - 如果更改名称或方法签名将更难维护。