我通过命令行使用mocha来测试Web应用程序。有一个功能仅用于辅助单元测试,仅暴露于单元测试。这就是如何实现的:
function inUnitTest() {
return typeof window.QUnit === 'object';
}
var messagesModel = (function(){
//functions
var exports = {
//exported functions
};
if(inUnitTest()){
exports = $.extend({}, exports,
{
reset:function(){
messages = [];
}
}
);
}
return exports;
}());
我正在使用Qunit进行单元测试,因此在测试窗口期间.Qunit是一个对象,因此inUnitTest()
返回true并且显示重置函数。
我一直试图为我的自动摩卡测试做类似的事情。我正在使用包装Selenium webdriver的yiewd。 Webdriver有一个允许你执行任意javascript的功能。这就是我正在执行的内容:
yield driver.execute('window.automatedTesting = true');
在应用程序代码中我有:
function inAutomatedTest() {
if(typeof window.automatedTesting === 'boolean' && window.automatedTesting) {
return true;
}
return false;
}
var messagesModel = (function(){
//functions and exports
if(inAutomatedTest()){
exports = $.extend({}, exports,
{
reset:function(){
messages = [];
}
}
);
}
return exports;
}());
我从命令行运行npm test
,该命令行运行package.json中的测试脚本。我的package.json是:
{
"devDependencies": {
"chai": "^2.3.0",
"chai-colors": "^1.0.0",
"yiewd": "^0.6.0"
},
"scripts": {
"test": "mocha --harmony --timeout 0 tests/*/*.js"
}
}
即。我在mocha测试中设置window.automatedTesting = true
并在我的应用程序代码中检查:
describe("Test case", function() {
before(function(done) {
//set up code
});
describe("Given .....", function() {
it("Then ....", function(done) {
driver.run(function*() {
yield driver.execute('window.automatedTesting = true');
//the next function relies on messagesModel.reset() being called
yield setMessagesAsZeroMessages();
done();
});
});
});
});
但是,这不起作用 - inAutomatedTest()
始终返回false,因此messagesModel.reset
未公开且无法调用。
好像mocha上下文中的window
对象与应用程序代码的window
对象不同。
我做错了什么吗?有没有不同的,但仍然很简单的方法?