运行 单元测试中的变量成功 - Node、Mocha、Chai、Karma、Grunt
Variable success in running unit tests - Node, Mocha, Chai, Karma, Grunt
我有一个围绕 JavaScript 应用程序代码构建的测试套件,其中包含约 350 个测试。我的测试是 运行 by 运行ning grunt test
来自节点命令行。每次测试 运行,在它停止之前我的测试数量不同 运行。它很少完成我所有的测试。以前有没有人发生过这种事情?关于可能导致它的原因有什么想法吗?
当我运行测试时,我通常会得到一个看似随机的数字,从270 - 350 测试完成。测试后,我没有得到任何错误或任何东西。它的结尾是这样的:
Finished in 1.332 secs / 0.823 secs
Summary:
√ 311 test completed
这是一个很少得到 运行 的测试示例:
describe('util.js', function() {
it('should create the global SeniorHomes object', function() {
expect(sh).to.be.an('object');
});
describe('sh.cookies.create', function() {
sh.cookies.create('name', 'value', 10);
it('should create a cookie', function() {
var cookies = document.cookie.split('; '),
cookie;
$.each(cookies, function(i, item) {
if (item.split('=')[0] === 'name') {
cookie = {
name: item.split('=')[0],
value: item.split('=')[1]
};
}
});
expect(cookie.name).to.equal('name');
expect(cookie.value).to.equal('value');
});
});
describe('sh.cookies.read', function() {
sh.cookies.create('name2', 'value2', 10);
var cookie = sh.cookies.read('name2');
it('should read the value of a cookie', function() {
expect(cookie).to.equal('value2');
});
});
describe('sh.cookies.erase', function() {
sh.cookies.create('name3', 'value3', 10);
sh.cookies.erase('name3');
it('should delete a cookie', function() {
expect(sh.cookies.read('name3')).to.equal(null);
});
});
describe('sh.format_time', function() {
var date1 = new Date('01/31/2005 10:00'),
date2 = new Date('01/31/2005 15:59'),
output1 = sh.format_time(date1),
output2 = sh.format_time(date2);
it('should output a formatted time string', function() {
expect(output1).to.equal('10:00 am');
expect(output2).to.equal('3:59 pm');
});
});
describe('sh.to_title_case', function() {
var output = sh.to_title_case('test_string');
it('should output a title formatted string', function() {
expect(output).to.equal('Test String');
});
});
describe('sh.to_snake_case', function() {
var output = sh.to_snake_case('Test String');
it('should ouput a snake cased string', function() {
expect(output).to.equal('test_string');
});
});
describe('copy_object', function() {
var original = {
test1: {
test2: 'test3'
}
};
var copy = sh.copy_object(original);
it('should create a copy of the original object', function() {
expect(copy.test1.test2).to.equal(original.test1.test2);
});
});
});
这是正在测试的 JavaScript:
/**
* Name: Util.js
* Description: Contains javascript used on both frontend and backend
* Note: jQuery Dependent
*/
/**
* Global namespace for site functionality
* @type {Object}
*/
if (!sh) {
var Site = function() {},
sh = new Site();
}
$(function() {
//apply calendar datepicker (jquery ui) to input
$('.datePicker').datepicker();
$('.datestampPicker').datepicker({
dateFormat: "yy-mm-dd 00:00:00"
});
//Alert confirm message for .confirm buttons
$('.confirm').click(function(e) {
var confirmation = confirm('Are you sure you want to do this?');
if (!confirmation)
e.preventDefault();
});});
sh.environment = (function() {
var subdomain = window.location.host.split('.')[0];
if(subdomain === 'www') {
return 'production';
} else {
return 'development';
}
})();
sh.cookies = {};
/**
* Create a cookie
* @param {string} name name of cookie
* @param {string} value value of cookie
* @param {int} days expiration length
* @return {null} no return value
*/
sh.cookies.create = function(name, value, days){
var expires = '';
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
}
document.cookie = name + "=" + value + expires + "; path=/";
};
/**
* Read the value of a cookie
* @param {string} name name of cookie
* @return {string|null} value of cookie
*/
sh.cookies.read = function(name){
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
};
/**
* Erase a cookie
* @param {string} name name of cookie
* @return {null} no return value
*/
sh.cookies.erase = function(name){
sh.cookies.create(name, "", -1);
};
/**
* Get a formatted time from a JavaScript date time object
* @param {object} time date time
* @return {string} formatted date time (hh:mm pm/am)
*/
sh.format_time = function(time){
var minuteFormat = time.getMinutes() < 10 ? '0' + time.getMinutes() : time.getMinutes();
var timeString =
time.getHours() - 12 > 0 ?
time.getHours() - 12 + ':' + minuteFormat + ' pm' : time.getHours() + ':' + minuteFormat + ' am';
return timeString;
};
/**
* Formats a string to capital letters with spaces
* @param {string} str string to be title-cased (test_string)
* @return {string} title case version of str (Test String)
*/
sh.to_title_case = function(str){
return str.replace(/_/g, ' ').replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};
/**
* Formats a string to lower case with underscores instead of spaces
* @param {string} str string to be snake cased (Test String)
* @return {string} snake case version of str (test_string)
*/
sh.to_snake_case = function(str){
return str.toLowerCase().replace(/ /g,'_');
};
/**
* Produces a copy of a javascript object
* @param {object} object object to be copied
* @return {object} copy
*/
sh.copy_object = function(object) {
return JSON.parse(JSON.stringify(object));
};
//returns the version of ie as integer
sh.get_ie = (function() {
var myNav = navigator.userAgent.toLowerCase();
return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}());
/**
* Various data structures
*
* @type {Object}
*/
sh.structures = {};
/**
* A general exception
*/
sh.structures.Exception = Error;
当我 运行 将测试作为单个 运行 时,它会说由于警告而中止。有一些关于执行整页重新加载的测试的警告。所以,我删除了两个函数的测试:
请求桌面版本:添加 cookie 并重新加载页面以仅获取桌面样式。
请求移动版本:删除 cookie 并重新加载以获取移动样式
删除这些后,我得到了一致数量的测试完成消息 "Done, without errors."
我有一个围绕 JavaScript 应用程序代码构建的测试套件,其中包含约 350 个测试。我的测试是 运行 by 运行ning grunt test
来自节点命令行。每次测试 运行,在它停止之前我的测试数量不同 运行。它很少完成我所有的测试。以前有没有人发生过这种事情?关于可能导致它的原因有什么想法吗?
当我运行测试时,我通常会得到一个看似随机的数字,从270 - 350 测试完成。测试后,我没有得到任何错误或任何东西。它的结尾是这样的:
Finished in 1.332 secs / 0.823 secs
Summary:
√ 311 test completed
这是一个很少得到 运行 的测试示例:
describe('util.js', function() {
it('should create the global SeniorHomes object', function() {
expect(sh).to.be.an('object');
});
describe('sh.cookies.create', function() {
sh.cookies.create('name', 'value', 10);
it('should create a cookie', function() {
var cookies = document.cookie.split('; '),
cookie;
$.each(cookies, function(i, item) {
if (item.split('=')[0] === 'name') {
cookie = {
name: item.split('=')[0],
value: item.split('=')[1]
};
}
});
expect(cookie.name).to.equal('name');
expect(cookie.value).to.equal('value');
});
});
describe('sh.cookies.read', function() {
sh.cookies.create('name2', 'value2', 10);
var cookie = sh.cookies.read('name2');
it('should read the value of a cookie', function() {
expect(cookie).to.equal('value2');
});
});
describe('sh.cookies.erase', function() {
sh.cookies.create('name3', 'value3', 10);
sh.cookies.erase('name3');
it('should delete a cookie', function() {
expect(sh.cookies.read('name3')).to.equal(null);
});
});
describe('sh.format_time', function() {
var date1 = new Date('01/31/2005 10:00'),
date2 = new Date('01/31/2005 15:59'),
output1 = sh.format_time(date1),
output2 = sh.format_time(date2);
it('should output a formatted time string', function() {
expect(output1).to.equal('10:00 am');
expect(output2).to.equal('3:59 pm');
});
});
describe('sh.to_title_case', function() {
var output = sh.to_title_case('test_string');
it('should output a title formatted string', function() {
expect(output).to.equal('Test String');
});
});
describe('sh.to_snake_case', function() {
var output = sh.to_snake_case('Test String');
it('should ouput a snake cased string', function() {
expect(output).to.equal('test_string');
});
});
describe('copy_object', function() {
var original = {
test1: {
test2: 'test3'
}
};
var copy = sh.copy_object(original);
it('should create a copy of the original object', function() {
expect(copy.test1.test2).to.equal(original.test1.test2);
});
});
});
这是正在测试的 JavaScript:
/**
* Name: Util.js
* Description: Contains javascript used on both frontend and backend
* Note: jQuery Dependent
*/
/**
* Global namespace for site functionality
* @type {Object}
*/
if (!sh) {
var Site = function() {},
sh = new Site();
}
$(function() {
//apply calendar datepicker (jquery ui) to input
$('.datePicker').datepicker();
$('.datestampPicker').datepicker({
dateFormat: "yy-mm-dd 00:00:00"
});
//Alert confirm message for .confirm buttons
$('.confirm').click(function(e) {
var confirmation = confirm('Are you sure you want to do this?');
if (!confirmation)
e.preventDefault();
});});
sh.environment = (function() {
var subdomain = window.location.host.split('.')[0];
if(subdomain === 'www') {
return 'production';
} else {
return 'development';
}
})();
sh.cookies = {};
/**
* Create a cookie
* @param {string} name name of cookie
* @param {string} value value of cookie
* @param {int} days expiration length
* @return {null} no return value
*/
sh.cookies.create = function(name, value, days){
var expires = '';
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
}
document.cookie = name + "=" + value + expires + "; path=/";
};
/**
* Read the value of a cookie
* @param {string} name name of cookie
* @return {string|null} value of cookie
*/
sh.cookies.read = function(name){
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
};
/**
* Erase a cookie
* @param {string} name name of cookie
* @return {null} no return value
*/
sh.cookies.erase = function(name){
sh.cookies.create(name, "", -1);
};
/**
* Get a formatted time from a JavaScript date time object
* @param {object} time date time
* @return {string} formatted date time (hh:mm pm/am)
*/
sh.format_time = function(time){
var minuteFormat = time.getMinutes() < 10 ? '0' + time.getMinutes() : time.getMinutes();
var timeString =
time.getHours() - 12 > 0 ?
time.getHours() - 12 + ':' + minuteFormat + ' pm' : time.getHours() + ':' + minuteFormat + ' am';
return timeString;
};
/**
* Formats a string to capital letters with spaces
* @param {string} str string to be title-cased (test_string)
* @return {string} title case version of str (Test String)
*/
sh.to_title_case = function(str){
return str.replace(/_/g, ' ').replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};
/**
* Formats a string to lower case with underscores instead of spaces
* @param {string} str string to be snake cased (Test String)
* @return {string} snake case version of str (test_string)
*/
sh.to_snake_case = function(str){
return str.toLowerCase().replace(/ /g,'_');
};
/**
* Produces a copy of a javascript object
* @param {object} object object to be copied
* @return {object} copy
*/
sh.copy_object = function(object) {
return JSON.parse(JSON.stringify(object));
};
//returns the version of ie as integer
sh.get_ie = (function() {
var myNav = navigator.userAgent.toLowerCase();
return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}());
/**
* Various data structures
*
* @type {Object}
*/
sh.structures = {};
/**
* A general exception
*/
sh.structures.Exception = Error;
当我 运行 将测试作为单个 运行 时,它会说由于警告而中止。有一些关于执行整页重新加载的测试的警告。所以,我删除了两个函数的测试:
请求桌面版本:添加 cookie 并重新加载页面以仅获取桌面样式。
请求移动版本:删除 cookie 并重新加载以获取移动样式
删除这些后,我得到了一致数量的测试完成消息 "Done, without errors."