单元测试自定义OnRender-Method [英] unit testing custom OnRender-Method

查看:58
本文介绍了单元测试自定义OnRender-Method的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a custom control MyControl which inherits from Canvas and which has its own logic inside the OnRender-Method. It should draw some rectangles and text into the drawing context.

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

由于我必须开发测试驱动程序,因此我想对 OnRender -Method进行单元测试.我尝试了几种无效的解决方案.所有这些都需要一个用于测试目的的继承类,我将其称为 TestingMyControl ,并以以下形式公开 OnRender -Method:

Since I have to develop test-driven, I want to unit test the OnRender-Method. I tried several solutions which did not work. All of them required an inherited class for testing purpose, which I will call TestingMyControl and which exposes the OnRender-Method in the follwing form:

public class TestingMyControl : MyControl
{
    public void Render(DrawingContext dc)
    {
        base.OnRender(dc);
    }
}

  1. 因为 DrawingContext 是一个抽象类,所以我认为我可以实现一个实现 DrawingContext 的测试类.然后,我可以收集应该绘制的所有矩形和文本,并对此进行断言.问题: DrawingContext 有一个内部构造函数,所以我不能从中继承.

  1. Since DrawingContext is an abstract class, I thought I could implement a test class which implements DrawingContext. I could then collect all the rectangles and text which it should draw, and make assertions against this. Problem: DrawingContext has an internal constructor, so I cannot inherit from it.

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

Since DrawingContext is an abstract class, I thought I could create a Mock of it. Problem: it has some internal abstract Methods, so Rhino-Mocks could not create a proxy, since it cannot implement these internal abstract Methods.

所以我有一个问题,我无法测试OnRender-Method,因为我无法创建 DrawingContext ...

So I have the problem, that I cannot test the OnRender-Method, since I cannot create an Instance of DrawingContext...

推荐答案

解决方案是从 DrawingGroup 中创建 DrawingContext .

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));
    }
}

这篇关于单元测试自定义OnRender-Method的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆