2016-01-29 35 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

太棒了,我在想着完全一樣的線 - 謝謝你的確認! –