Dan*_*ose 4 c# wpf unit-testing
在我的应用程序中,我使用自定义UIElement,它处理自己的布局和渲染.虽然我可以对其中的大部分进行单元测试,但我无法正确地对渲染进行单元测试.原因是渲染是通过OnRender方法完成的,但是我无法测试实际渲染的内容,因为DrawingContext是一个带有内部构造函数的抽象类,所以我无法从中导出它以进行测试.
我知道如何做的唯一测试是尝试不同的场景(基于实现的代码)并检查没有抛出异常.有没有办法测试更多(除了使用TypeMock Isolator或JustMock)?
我在这个帖子中写了答案:单元测试自定义OnRender-Method
但是,我仍然将答案复制到这个帖子(有人可能会删除它,如果不需要的话).
解决方案是创建DrawingContext一个DrawingGroup.
public class TestingMyControl : MyControl
{
public DrawingGroup Render()
{
var drawingGroup = new DrawingGroup();
using (var drawingContext = drawingGroup.Open())
{
base.OnRender(drawingContext);
}
return drawingGroup;
}
}
Run Code Online (Sandbox Code Playgroud)
所以夹具看起来像:
[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));
}
Run Code Online (Sandbox Code Playgroud)
这需要以下生产代码:
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));
}
}
Run Code Online (Sandbox Code Playgroud)