2016-01-29 39 views
2

我的应用程序(C#,WinForms)是一个图形编辑器,所以绘图是功能的主要部分。我在绘图时遇到了单元测试逻辑的困难,这让我认为我的设计是错误的。让我来描述一下,我希望得到关于如何进行单元测试或如何重构我的应用逻辑的建议。如何对绘图图形进行单元测试?

所有图形都由管理器(DrawingManager)处理,它执行几何计算并与绘制显示结果的控件的画布进行交互。该管理器的典型方法将通过对绘图画布(Graphics)的引用来调用。在应用程序的表面事件(如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); 
    } 

现在,让我们说,它开始调用Graphics的方法来输出的几何前DrawObjects调用逻辑中的任一个路径或其他。 我想单元测试这个管理器中的逻辑,但是它与Graphics实例的耦合使得它不可能,至少我不知道如何去做。我用于隔离的Moq不能嘲笑一个密封的课程。如果我可以放入某种注册器而不是图形,并且能够看到图形被调用的方法和时间,那将是甜蜜的。 请指教!

回答

2

考虑使用Adapter pattern来包装图形对象在接口中所需的功能。

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)); 
+0

太棒了,我在想着完全一样的线 - 谢谢你的确认! –