你如何对Office.js应用程序代码进行单元测试?

7

有没有针对基于office.js的代码进行单元测试的常见实践、框架或模式? 考虑到对象模型中组件的数量很大,无法模拟对office.js的调用。 是否有像karma启动器那样可以将测试代码启动到测试容器任务窗格应用程序中的工具? 有人找到了一种有效的方法来测试与office.js交互的代码吗?

2个回答

1
我认为您应该像测试“标准”javascript代码一样测试基于Office.js的代码。实际上,Office.js就像JQuery等其他javascript依赖项一样。
当然,您不应在测试页面中包含Office.js,并用模拟替换Office对象。您可以查看Sinon Js,这是一个javascript模拟框架。
当您编写单元测试时,您会隔离一个被称为系统受测单元(SUT)的代码片段(类或模块)。如果您的插件是基于Angular等单页应用程序框架构建的,则SUT可以是控制器。然后,您可以将Office对象作为依赖项注入,在真实情况下,这将是来自Office.js的真实Office。在测试中,这将是一个模拟。

理论上,是的,这就是我们要做的。然而,如果你以https://github.com/OfficeDev/office-js-docs/blob/master/docs/excel/build-your-first-excel-add-in.md为例的代码,模拟Office对象将会变得过于繁琐。你需要模拟工作簿、工作表、范围、图表和所有子对象。因此,模拟似乎不是一个选项。正如jquery单元测试不创建模拟DOM,而是在HTML页面上运行一样,我想基于Office.js的测试需要在容器任务窗格应用程序上运行。 - Sameera
@Sameera 如果你只做单元测试(没有集成测试),你不需要模拟所有东西,只需要模拟你的 SUT 使用的 Office 方法/属性即可。这应该不是很多工作... - Benoit Patra
@Sameera,我想补充的是,在现实中,我会编写独立的函数来接受输入/输出,并对它们进行单元测试,与Office.js完全无关。然后,我会有另一组集成测试在Excel中运行,并尽可能接近用户交互,除了是由程序驱动而不是UI驱动。 - Michael Zlatkovsky - Microsoft
@MichaelZlatkovsky 如果您使用我在第一条评论中链接的示例代码,函数loadDataAndCreateChart将填充给定范围内的数据,在活动工作表上创建图表并对其进行格式化。显然,这不是最佳实践,因为该函数不遵循单一职责原则。但是,这样的代码可能很常见,因为批量操作Office.js代理对象并与Excel同步比在执行小单位工作后多次调用Excel更有效率(这将是可测试的)。这种观念是否错误? - Sameera
@Sameera,抱歉,看起来这个线程已经从我的视线中消失了。如果你仍然有问题(实际上,它听起来与测试无关),你介意在不同的StackOverflow线程中开始吗? - Michael Zlatkovsky - Microsoft

0

这是我最终所做的事情:

  1. 向解决方案中添加新的任务窗格应用项目
  2. https://github.com/jasmine/jasmine/releases中包含Jasmine Standalone zip
  3. 使任务窗格应用的清单源位置指向SpecRunner.html
  4. 修改boot.js以将测试规范的执行从window.load更改为在Office.initilize上执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接