gpt4 book ai didi

c# - 单元测试自定义 OnRender-Method

转载 作者:行者123 更新时间:2023-11-30 14:53:22 24 4
gpt4 key购买 nike

我有一个自定义控件 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-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-Method,因为我无法创建 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));
}
}

关于c# - 单元测试自定义 OnRender-Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com