我的应用程序(C#,WinForms)是一个图形编辑器,因此绘图是功能的主要部分。我在绘图时遇到单元测试逻辑的困难,这让我觉得我的设计是错误的。让我来描述它,我想对如何进行单元测试或如何重构我的应用程序逻辑提出一些建议。
所有绘图都由经理(DrawingManager)处理,经理进行几何计算,并与显示结果的绘图画布交互。可以通过引用绘图画布(Graphics)来调用此管理器的典型方法。在应用程序的表面事件(如OnPaint)中的某个地方,我们将控制权交给经理,该经理决定要绘制什么以及如何绘制,然后绘制。要绘制,它需要保存对Graphics对象的引用,这就是它从事件传递给manager的方法的原因。
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的方法输出几何体之前调用逻辑路径或另一路径。 我想以某种方式对这个管理器中的逻辑进行单元测试,但它与Graphics实例的耦合使得它在某种程度上是不可能的,至少我不知道该怎么做。我用来隔离的Moq不能模拟密封类。如果我可以放入某种registrator而不是Graphics并且能够看到调用Graphics的方法以及何时调用,那将是很好的。 请指教!
答案 0 :(得分:2)
考虑使用Adapter pattern来包装接口中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));