如何单元测试绘图图形



我的应用程序(C#,WinForms)是一个图形编辑器,所以绘图是功能的主要部分。我在围绕绘图的单元测试逻辑时遇到困难,这让我认为我的设计是错误的。让我描述一下,我想就如何进行单元测试或如何重构应用程序的逻辑提供一些建议。

所有绘图都由管理器(DrawingManager)处理,该管理器执行几何计算并与显示结果的控件的绘图画布进行交互。此管理器的典型方法是通过引用绘图画布(图形)来调用。在应用程序的表面事件(如OnPaint)的某个地方,我们将控制权交给经理,经理决定绘制什么以及如何绘制,然后绘制。若要绘制,它需要保存对 Graphics 对象的引用,这就是将其从事件传递给管理器方法的原因。

    protected override void OnPaint(PaintEventArgs e)
    {            
        IZoomBoxDrawingManager drawingManager = ServiceLocator.Instance.Resolve<IZoomBoxDrawingManager>();
        drawingManager.DrawMainImage(this, e.Graphics);
        drawingManager.DrawObjects(this, e.Graphics);
        base.OnPaint(e);
    }

现在,假设 DrawObjects 在开始调用 Graphics 的方法输出几何体之前调用一条逻辑路径或另一条逻辑路径。我想以某种方式对这个管理器中的逻辑进行单元测试,但它与图形实例的耦合使其变得不可能,至少我不知道该怎么做。我用于隔离的最小起订量不能模拟密封类。如果我能输入某种注册者而不是图形,并且能够看到调用了哪些图形方法以及何时调用,那就太好了。请指教!

请考虑使用适配器模式将图形对象所需的功能包装在接口中。

interface IGraphics
{
    void DrawCircle(int x,int y,int d);
}
public class GraphicsAdapter : IGraphics
{
    private readonly Graphics graphics;
    public GraphicsAdapter(Graphics g)
    {
        this.graphics = g;
    }
    public void DrawCircle(int x, int y, int d)
    {
        graphics.DrawCircle(x, y, d);
    }
}

现在,您的DrawingManager可以依赖于IGraphics接口,而不是密封的Graphics对象。 您可以在测试期间模拟它,但在运行时使用适配器:

drawingManager.DrawObjects(this, new GraphicsAdapter(e.Graphics));

最新更新