我有一个自定义控件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);
}
}DrawingContext是一个抽象类,所以我想我可以实现一个实现DrawingContext的测试类。然后,我可以收集它应该绘制的所有矩形和文本,并对其进行断言。Problem:DrawingContext有一个内部构造函数,所以我不能继承它。DrawingContext是一个抽象类,所以我想我可以创建一个模拟类。Problem:它有一些内部抽象方法,因此Rhino无法创建代理,因为它不能实现这些内部抽象方法。所以我有一个问题,我不能测试OnRender-方法,因为我不能创建一个DrawingContext的实例.
发布于 2015-04-14 08:49:33
解决方案是,从一个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));
}
}https://stackoverflow.com/questions/29622996
复制相似问题