unit testing自定义OnRender-Method
我有一个自定义控件MyControl
,它inheritance自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进行unit testing。 我尝试了几种不起作用的解决方案。 所有这些都需要一个inheritance的类用于测试目的,我将调用TestingMyControl
并以下面的forms公开OnRender
TestingMyControl
:
public class TestingMyControl : MyControl { public void Render(DrawingContext dc) { base.OnRender(dc); } }
-
由于
DrawingContext
是一个抽象类,我想我可以实现一个实现DrawingContext
的测试类。 然后我可以收集它应该绘制的所有矩形和文本,并对此进行断言。 问题 :DrawingContext
有一个内部构造函数,所以我不能inheritance它。 -
由于
DrawingContext
是一个抽象类,我想我可以创建它的模拟。 问题 :它有一些内部抽象方法,因此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)); } }