单元测试自定义OnRender-Method

时间:2015-04-14 08:49:33

标签: c# wpf

我有一个自定义控件MyControl,它继承自Canvas,并且在OnRender - Method中有自己的逻辑。 它应该在绘图环境中绘制一些矩形和文本。

public class MyControl : Canvas
{
    protected override void OnRender(DrawingContext dc)
    {
        // do something like dc.DrawRectangle(...);
        // do something like dc.DrawText(...);
    }
}

由于我必须开发测试驱动,我想对OnRender - 方法进行单元测试。 我尝试了几种不起作用的解决方案。所有这些都需要一个继承的类用于测试目的,我将其称为TestingMyControl,并以下列形式公开OnRender - 方法:

public class TestingMyControl : MyControl
{
    public void Render(DrawingContext dc)
    {
        base.OnRender(dc);
    }
}
  1. 由于DrawingContext是一个抽象类,我想我可以实现一个实现DrawingContext的测试类。然后我可以收集它应该绘制的所有矩形和文本,并对此进行断言。 问题DrawingContext有一个内部构造函数,因此我无法继承它。

  2. 由于DrawingContext是一个抽象类,我以为我可以创建它的模拟。 问题:它有一些内部抽象方法,因此Rhino-Mocks无法创建代理,因为它无法实现这些内部抽象方法。

  3. 所以我遇到了问题,我无法测试OnRender-Method,因为我无法创建DrawingContext的实例...

1 个答案:

答案 0 :(得分:5)

解决方案是,从DrawingContext创建DrawingGroup

public class TestingMyControl : MyControl
{
    public DrawingGroup Render()
    {
        var drawingGroup = new DrawingGroup();
        using (var drawingContext = drawingGroup.Open())
        {
             base.OnRender(drawingContext);
        }

        return drawingGroup;
    }
}

所以夹具看起来像:

    [Test]
    public void Should_render()
    {
        var controlToTest = new TestingMyControl();

        var drawingGroup = controlToTest.Render();

        var drawing = drawingGroup.Children[0] as GeometryDrawing;
        Assert.That(drawing.Brush, Is.EqualTo(Brushes.Black));
        Assert.That(drawing.Pen.Brush, Is.EqualTo(Brushes.SeaGreen));
        Assert.That(drawing.Pen.Thickness, Is.EqualTo(0.6));
        Assert.That(drawing.Bounds.X, Is.EqualTo(5));
        Assert.That(drawing.Bounds.Y, Is.EqualTo(15));
        Assert.That(drawing.Bounds.Width, Is.EqualTo(25));
        Assert.That(drawing.Bounds.Height, Is.EqualTo(35));
    }

这需要以下生产代码:

public class MyControl : Canvas
{
    protected override void OnRender(DrawingContext dc)
    {
        dc.DrawRectangle(Brushes.Black, new Pen(Brushes.SeaGreen, 0.6), new Rect(5, 15, 25, 35));
    }
}