如何在没有访问器的情况下对派生的DataGridViewCell进行单元测试?

时间:2014-01-29 10:49:56

标签: c# unit-testing datagridview mstest accessor

我正在为一个看起来有点像这样的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之后不再使用访问器。

如何在不使用访问器的情况下对此逻辑进行单元测试?

2 个答案:

答案 0 :(得分:1)

因为很明显要设置DataGridViewCellDataGridView,还有很多工作要做,为什么不尝试别的?< / 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的一个明显缺点是方法名称只是存储为字符串 - 如果更改名称或方法签名将更难维护。