python - 使 python COM 客户端可测试
问题描述
我已经阅读了有关 python 中的单元测试的信息,但是我发现的所有示例都是基于模拟对象的简单示例。我不知道如何以一种无需访问 COM 端口即可对其进行测试的方式真正实现项目测试。该项目主要用于通过COM API控制另一个应用程序以及评估应用程序产生的数据并制作报告,因此可以说它是作为python库制作的更高抽象级别的api。COM 接口是非平凡的,主要对象暴露了一些管理器,管理器暴露了对象的容器,这些容器具有对另一个对象的引用,因此一个连接对象的网络负责不同的事物控制应用程序。python 库的架构以某种方式遵循 COM 结构。在库导入期间,主 COM 对象被调度并存储在中心模块中,导入时的管理器级模块从中央模块获取对 COM 管理器对象的引用,然后管理器级方法在其方法中使用此 COM 管理器对象。更好理解的例子
#__init__
from managera import ManagerA
from centralobject import CentralObject
central_object = CentralObject()
manager_a = ManagerA() #here all initialisation to make everything work,
manager_b = ManagerB() #so full com object needed to import the package
...
#centalobject
class CentalObject():
def __init__():
self.com = Dispatch("application")
...
#managera
from project import central_object
class ManagerA():
def __init__():
self.com = central_object.com.manager_a
def manager_a_method1(x):
foo = self.com.somecontainer[x].somemethod()
foo.configure(3)
return foo
...
在当前状态下,很难测试。如果没有连接到 COM 应用程序,甚至无法导入。Dispatch 可以移动到导入后执行的某个 init 函数中,但我看不出它如何使测试成为可能。一种解决方案是制作与原始应用程序结构相似的测试替身,但对于我没有经验的测试头脑来说,在每个方法测试中这样做似乎有点矫枉过正。也许不是,应该这样做,我在问别人更多的经验建议。我想到的第二个解决方案是每次进行任何 COM 调用时分派 COM 对象,然后对其进行模拟,但似乎有很多分派,我看不出它如何使代码更好。也尝试过不将管理器定义为类,而是模块,
应该怎么做才能在不访问 COM 的情况下使测试变得可行和良好?对一切都感兴趣:解决方案、建议或只是我应该阅读更多的主题。
解决方案
推荐阅读
- c - 不使用 struct 在 C 中显示所有数据
- c++ - 为什么 Visual Studio 试图从 Team Fortress 2 加载 SDL2?
- lisp - lisp 中的递归跟踪......可以使用一些建议
- machine-learning - 在随机森林回归器中执行修剪的正确方法是什么?
- visual-studio-code - Arduino vscode:标识符“sprintf”未定义
- prolog - source_sink `library(matrix)' 不存在
- input - 变音符号和上标的简单输入
- php - Laravel - 如何汇总子数据并将其传递给父@foreach
- python - 交替合并两个列表 n 个元素
- html - 在图像的中心放置一种边框 HTML 和 CSS