【问题标题】:unit testing custom OnRender-Method单元测试自定义 OnRender-Method
【发布时间】:2015-04-14 08:49:33
【问题描述】:

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

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:

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

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

所以我有一个问题,我无法测试 OnRender 方法,因为我无法创建 DrawingContext 的实例...

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    解决方案是从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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2018-02-25
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多