11

我们正在开发在 AutoCAD 中使用的应用程序。基本上,我们创建一个类库项目,并使用命令 (NETLOAD) 在 AutoCAD 中加载 .dll。

因此,我们可以使用命令、“调色板”、用户控件、表单等......

AutoDesk 通过一些 dll 提供 API,在它们的程序目录中运行。引用这些 dll 时,您只能在运行时调用 dll,同时在 AutoCAD 中加载您的应用程序(这是 AutoDesk 的许可安全)。

对我们来说,在开发的时候,这不是问题,我们需要在 AutoCAD 的上下文中进行可视化测试,所以我们只需设置 Debug Properties 以便它们启动 acad.exe 并在 acad.exe 参数中使用脚本加载我们的 dll .

问题是,当尝试对我们的代码进行单元测试时,NUnit 或 mstest 没有在 AutoCAD 上下文中运行,它们也无法启动它。有一个名为 Gallio 的工具,它提供了与 AutoCAD 的接口,因此它可以通过 IPC 和 Named Pipes 运行单元测试。

但是,对我来说,这个解决方案太麻烦了。我希望能够快速编写测试,而不必离开我心爱的 IDE。

那么,从“好的设计观点”来看,什么是解决这个问题的好方法呢?我想我基本上需要一个不引用 AutoCAD dll 的可测试代码库和一个引用不可测试 AutoCAD dll 的不可测试代码库。

我确信有办法让它发挥作用:(IOC、DI、适配器模式,..)我只是没有深入了解这些原则,因此我不知道哪条路线最适合我的目的和目标。

4

2 回答 2

9

第一步是对需要 AutoCAD 的部分和真正独立的部分的代码进行分类。像往常一样为独立部分创建单元测试。

对于其他部分,您需要行为类似于 AutoCAD 的模型。使它们尽可能简单(例如,只在方法中返回正确答案而不进行任何计算)。现在,您需要几组类:

  1. 一组接口,您的代码用于实现某些目标(例如,加载绘图)。

  2. 用于调用 AutoCAD dll 的所述一组接口的一组实现。

  3. 一组在 AutoCAD 上下文中尝试实现的类。只需创建一个带有几个按钮的小型 UI,您可以在其中运行此代码。它用于向自己保证您的模型做正确的事情。将方法参数和结果记录到某个文件中,以便您可以尝试 AutoCAD 的响应方式。如果模型中断,您可以使用此代码来验证 AutoCAD 正在做什么,并且可以在开发模型时将其用作参考。

  4. 当您知道 AutoCAD 如何响应时,创建模型。在您的测试中,使用所需的结果(和错误,以便您也可以测试错误处理)来创建它们。因此,当您拥有 时boolean loadDrawing(File filename),请创建一个返回true文件名exists.dxffalse其他任何内容的模型。

  5. 使用工厂或 DI 告诉您的应用程序代码使用哪个实现。我倾向于拥有一个大型的全局配置类,其中包含许多公共字段,我只是在其中存储要使用的对象。我可以在一开始就设置它,它很快,很容易理解。如果您需要在运行时创建对象,则将工厂放在为您生成对象的配置类中,这样您就可以将它们交换出去。

于 2009-02-11T14:25:17.320 回答
0

我写了......后来打破了...... AutoCAD的测试运行器。它位于https://github.com/CADbloke/CADtest。如果您对它感兴趣,请轻推我,我会更快地修复它。在我解决它之前,我正在等待 NUnit v3 版本。

如果您重置到该仓库中的第三次提交(我认为)并从那里摆弄它应该运行。

于 2015-10-15T02:05:59.897 回答