我们正在开发在AutoCAD中使用的应用程序.基本上我们创建一个类库项目,并使用命令(NETLOAD)在autoCAD中加载.dll.
因此,我们可以使用命令,"调色板",用户控件,表单等...
AutoDesk通过在程序目录中运行的某些dll提供API.在引用这些dll时,您只能在运行时在AutoCAD中加载应用程序时调用dll(这是AutoDesk的许可安全性).
对于我们来说,在开发时,这不是问题,我们需要在AutoCAD的上下文中进行可视化测试,因此我们只需设置Debug Properties以便它们启动acad.exe并使用acad.exe参数中的脚本加载我们的dll .
问题是,在尝试对我们的代码进行单元测试时,NUnit或mstest没有在AutoCAD上下文中运行,也无法启动它.有一个名为Gallio的工具,它提供了与AutoCAD的接口,因此它可以通过带有命名管道的IPC运行单元测试.
但是,对我来说,这个解决方案太麻烦了.我希望能够快速编写测试而无需离开我心爱的IDE.
那么,从"良好的设计观点"来看,这个问题的好方法是什么呢?我想我基本上需要一个可测试的代码库,它不参考AutoCAD dll和一个不可测试的参考不可测试的AutoCAD dll的代码库.
我确信有办法让这个工作:(IOC,DI,Adapter Pattern,...)我只是不深入这些原则,因此我不知道哪条路线最适合我的目的和目标.
第一步是对需要AutoCAD的零件和真正独立的零件进行分类.像往常一样为独立零件创建单元测试.
对于其他部分,您需要具有类似AutoCAD的模型.使它们尽可能简单(例如,只需在方法中返回正确答案而不进行任何计算).现在,您需要几组类:
代码用于实现某些内容的一组接口(例如,加载绘图).
调用AutoCAD dll的所述接口集的一组实现.
一组在AutoCAD上下文中尝试实现的类.只需创建一个带有几个按钮的小UI,您就可以在其中运行此代码.它用来向你保证你的模型做正确的事情.将方法参数和结果记录到某个文件,以便您可以尝试AutoCAD如何响应.如果模型中断,您可以使用此代码来验证AutoCAD正在执行的操作,并且可以在开发模型时将其用作参考.
了解AutoCAD的响应方式后,请创建模型.在测试中,使用所需的结果创建它们(和错误,因此您也可以测试错误处理).所以,当你有boolean loadDrawing(File filename)
,创建一个模型,返回true
文件名exists.dxf
和false
其他任何东西.
使用工厂或DI告诉您的应用程序代码使用哪种实现.我倾向于有一个很大的全局配置类,有很多公共字段,我只是存储要使用的对象.我可以在开始时设置它,它很快,很容易理解.如果需要在运行时创建对象,则将工厂放在config类中,为您生成对象,这样就可以将它们交换出来.