我正在制作一个小型测试框架,它使用
JavaScript模块模式在iOS上进行UI自动化测试.但是,基于
#import和扩展模块,我似乎得到了奇怪的结果.
我有一个名为Tester-Module.js的基本测试模块:
(function() { var Tester = this.Tester = {}; Tester.setUp = function() { UIALogger.logMessage('Regular SetUp()'); } }).call(this);
如果我在我的测试用例中导入此模块,它可以正常工作.这是测试文件tester.js(tester.js是我在Instruments中导入的文件):
#import "./Tester-Module.js" // Prints 'Regular SetUp()' Tester.setUp();
但是,如果我尝试在另一个模块文件中扩展Tester-Module.js模块,我就无法引用Tester对象. Tester-Extension.js扩展了Tester-Module.js中定义的Tester模块:
#import "./Tester-Module.js" // Outputs: // Exception raised while running script: // ReferenceError: Can't find variable: Tester\n Tester.setUp = function() { UIALogger.logMessage('Overwritten SetUp()'); }
更新的测试用例文件tester.js:
#import "./Tester-Extension.js" // Exception is thrown before this Tester.setUp();
我希望相关的问题是:
>为什么我不能在Tester-Extension.js中引用Tester对象,但可以在tester.js中引用?
> #import宏在做什么?
解决方法
经过一些搜索和测试之后,看起来在每个模块文件中使用#import – 类似于Node.js中的require – UI自动化框架不支持.
解决方法是包含一个头文件,它导入每个模块,然后在测试用例中导入它.使用上面的示例,头文件看起来像:
// Tester-Header.js #import "./Tester-Module.js" #import "./Tester-Extension.js"
#import "./Tester-Header.js" // Prints "Overwritten SetUp()" Tester.setUp();
Mother May UI BDD框架有一个更广泛的header file示例,并将头文件导入test file.公开:我编写了框架并最初问了这个问题,以使框架更加模块化.