jasmine-node js 并使用 done() 完成异步测试
jasmine-nodejs and using done() to complete asynch tests
我似乎在为我的 NodeJS 应用设置单元测试然后 运行使用 Jasmine 对它们进行测试时遇到问题。问题来自于使用 Jasmine 的 done
函数。每当我在测试中包含 done
函数时,我都会收到一条错误消息:Warning: Cannot read property 'clearTimeout' of undefined Use --force to continue.
我很确定我没有做正确的事情,但那件事是什么一直在躲避我。
我的Gruntfile.js:
module.exports = function(grunt){
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
grunt.initConfig({
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: '.jshintrc'
},
all: [
'Gruntfile.js',
'app/scripts/Directives/**/*.js',
'app/scripts/Services/**/*.js',
'app/scripts/app.js'
]
},
// Empties folders to start fresh
clean: {
options: { force: true },
dist: {
files: [
{
dot: true,
src: [
'/dist/*'
]
}
]
},
coverage: {
files: [
{
dot: true,
src: [
'.coverage/'
]
}
]
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [
{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt,json,js,shtml,template}',
'images/{,*/}*.{webp}',
'fonts/*',
'images/**/*.svg',
'api-documentation/**/**/*',
'api-explorer/**/*',
'styles/*.{ttf,woff,svg,css}',
'docs/**/*',
'template/**/*.{htm,html}',
'locale/*',
'config/*'
],
rename: function(dest, src){
if(src.indexOf('customizations.html.template') !== -1 ||
src.indexOf('customizations.js.template') !== -1){
console.log( dest + '/' + src.replace('.template', ''));
return dest + '/' + src.replace('.template', '');
}
return dest + '/' + src;
}
},
{
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: [
'generated/*'
]
},
{
expand:true,
cwd: '.tmp/styles',
dest: '<%= yeoman.dist %>/styles',
src:['customer.css']
}
]
}
},
// Test settings
karma: {
unit: {
configFile: 'karma.conf.js',
singleRun: true,
reporters: ['dots']
},
coverage: {
configFile: 'karma.coverage.conf.js',
singleRun: true,
reporters: ['spec', 'coverage'],
coverageReporter: {
type: 'html',
dir: '.coverage/'
}
},
node:{
configFile:'karma.node.conf.js',
singleRun:true,
reporters:['spec', 'coverage'],
coverageReporter: {
type: 'html',
dir: '.nodeCoverage/'
}
}
},
open : {
coverage : {
path: 'http://127.0.0.1:8888/src'
},
covReport: {
path: 'http://localhost:63342/ClassroomLibrary/' + grunt.file.expand('.coverage/Phantom*/index.html')
}
},
jasmine_nodejs:{
options:{
specNameSuffix:'node.spec.js',
reporters:{
console:{
colors:true,
cleanStack:1,
verbosity:4,
listStyle:'indent',
activity:false
}
}
},
all:{
options:{
useHelpers:true
},
specs:[
'tests/Node/**'
]
}
},
nodemon:{
tests:{
script:'app/index.js'
}
},
concurrent:{
nodeTests:['nodemon', 'jasmine_nodejs']
},
run_node:{
start:{
files:{src:['app/index.js']}
}
},
stop_node:{
stop:{
files:{src:['app/index.js']}
}
}
});
grunt.loadNpmTasks('grunt-jasmine-nodejs');
grunt.loadNpmTasks('grunt-nodemon');
grunt.loadNpmTasks('grunt-concurrent');
grunt.loadNpmTasks('grunt-run-node');
grunt.registerTask('test', [
'karma:unit'
]);
grunt.registerTask('coverage', [
'clean:coverage',
'karma:coverage',
'open:covReport'
]);
grunt.registerTask('nodeTests', ['concurrent:nodeTests']);
grunt.registerTask('testingNode', ['run_node', 'jasmine_nodejs', 'stop_node']);
//grunt.registerTask('karmaNode', ['run_node', 'karma:node', 'stop_node']);
};
有问题的测试套件:
var request = require('http');
describe('Node server', function(){
'use strict';
//http://www.randomjavascript.com/2012/12/using-jasmine-node-to-test-your-node.html
var serverUrl = 'http://127.0.0.1:2425';
it('should respond to /', function(done){
request.get(serverUrl, function(response){
expect(response.statusCode).toBe(200);
done();
});
});
});
显然,我已经尝试了几种不同的方法来实现它。 运行 他们通过 Karma 遇到的麻烦多于它的价值(我把那个配置留在那里以展示我尝试过的东西。)虽然我对 nodeMon 和 jasmine-nodejs 的输出很满意,但我仍然无法得到整个事情从前到后 运行 因为没有 done
功能,事情就像你期望的那样挂起。它应该就在那里,但对我来说不是。我的 package.json 包含:
{
"name": "myProject",
"version": "0.0.1",
"dependencies":{},
"devDependencies": {
"karma": "~0.13",
"karma-coverage": "~0.5",
"karma-phantomjs-launcher": "~1.0",
"karma-ng-html2js-preprocessor": "~0.1",
"phantomjs-prebuilt": "~2.1",
"grunt": "~1.0",
"grunt-contrib-clean": "~0.7",
"grunt-contrib-uglify": "~0.11",
"grunt-contrib-concat": "~0.5",
"grunt-contrib-copy": "~1.0",
"grunt-concurrent":"~2.3",
"grunt-jasmine-nodejs":"~1.5",
"grunt-jasmine-node-coverage":"0.5.0",
"grunt-open":"~0.2",
"grunt-nodemon":"~0.4",
"grunt-run-node":"~0.1",
"grunt-karma": "~0.12",
"jasmine-core": "~2.4",
"jasmine-node":"~1.14",
"karma-jasmine": "~0.3",
"karma-jasmine-matchers": "~2.0",
"karma-spec-reporter":"~0.0",
"karma-requirejs":"~1.0",
"load-grunt-tasks": "~3.4",
"uglify-js": "~2.6",
"grunt-sass": "~1.1",
"jshint":"~2.9"
},
"engines": {
"node": ">=0.12.0"
},
"scripts": {
"global": "npm i karma-cli grunt-cli -g"
}
}
谁能告诉我进程哪里缺少它需要的东西?
一个想法——你能确认你实际使用的 Jasmine 版本与你打算使用的相匹配吗?我认为 'done' 回调是在 2.0 中添加的,所以我可以看到这个错误发生在旧版本上...
编辑:您正在使用 1.3.1 版本的 "jasmine-node" 软件包,因此该功能将不可用。
我似乎在为我的 NodeJS 应用设置单元测试然后 运行使用 Jasmine 对它们进行测试时遇到问题。问题来自于使用 Jasmine 的 done
函数。每当我在测试中包含 done
函数时,我都会收到一条错误消息:Warning: Cannot read property 'clearTimeout' of undefined Use --force to continue.
我很确定我没有做正确的事情,但那件事是什么一直在躲避我。
我的Gruntfile.js:
module.exports = function(grunt){
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
grunt.initConfig({
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: '.jshintrc'
},
all: [
'Gruntfile.js',
'app/scripts/Directives/**/*.js',
'app/scripts/Services/**/*.js',
'app/scripts/app.js'
]
},
// Empties folders to start fresh
clean: {
options: { force: true },
dist: {
files: [
{
dot: true,
src: [
'/dist/*'
]
}
]
},
coverage: {
files: [
{
dot: true,
src: [
'.coverage/'
]
}
]
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [
{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt,json,js,shtml,template}',
'images/{,*/}*.{webp}',
'fonts/*',
'images/**/*.svg',
'api-documentation/**/**/*',
'api-explorer/**/*',
'styles/*.{ttf,woff,svg,css}',
'docs/**/*',
'template/**/*.{htm,html}',
'locale/*',
'config/*'
],
rename: function(dest, src){
if(src.indexOf('customizations.html.template') !== -1 ||
src.indexOf('customizations.js.template') !== -1){
console.log( dest + '/' + src.replace('.template', ''));
return dest + '/' + src.replace('.template', '');
}
return dest + '/' + src;
}
},
{
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: [
'generated/*'
]
},
{
expand:true,
cwd: '.tmp/styles',
dest: '<%= yeoman.dist %>/styles',
src:['customer.css']
}
]
}
},
// Test settings
karma: {
unit: {
configFile: 'karma.conf.js',
singleRun: true,
reporters: ['dots']
},
coverage: {
configFile: 'karma.coverage.conf.js',
singleRun: true,
reporters: ['spec', 'coverage'],
coverageReporter: {
type: 'html',
dir: '.coverage/'
}
},
node:{
configFile:'karma.node.conf.js',
singleRun:true,
reporters:['spec', 'coverage'],
coverageReporter: {
type: 'html',
dir: '.nodeCoverage/'
}
}
},
open : {
coverage : {
path: 'http://127.0.0.1:8888/src'
},
covReport: {
path: 'http://localhost:63342/ClassroomLibrary/' + grunt.file.expand('.coverage/Phantom*/index.html')
}
},
jasmine_nodejs:{
options:{
specNameSuffix:'node.spec.js',
reporters:{
console:{
colors:true,
cleanStack:1,
verbosity:4,
listStyle:'indent',
activity:false
}
}
},
all:{
options:{
useHelpers:true
},
specs:[
'tests/Node/**'
]
}
},
nodemon:{
tests:{
script:'app/index.js'
}
},
concurrent:{
nodeTests:['nodemon', 'jasmine_nodejs']
},
run_node:{
start:{
files:{src:['app/index.js']}
}
},
stop_node:{
stop:{
files:{src:['app/index.js']}
}
}
});
grunt.loadNpmTasks('grunt-jasmine-nodejs');
grunt.loadNpmTasks('grunt-nodemon');
grunt.loadNpmTasks('grunt-concurrent');
grunt.loadNpmTasks('grunt-run-node');
grunt.registerTask('test', [
'karma:unit'
]);
grunt.registerTask('coverage', [
'clean:coverage',
'karma:coverage',
'open:covReport'
]);
grunt.registerTask('nodeTests', ['concurrent:nodeTests']);
grunt.registerTask('testingNode', ['run_node', 'jasmine_nodejs', 'stop_node']);
//grunt.registerTask('karmaNode', ['run_node', 'karma:node', 'stop_node']);
};
有问题的测试套件:
var request = require('http');
describe('Node server', function(){
'use strict';
//http://www.randomjavascript.com/2012/12/using-jasmine-node-to-test-your-node.html
var serverUrl = 'http://127.0.0.1:2425';
it('should respond to /', function(done){
request.get(serverUrl, function(response){
expect(response.statusCode).toBe(200);
done();
});
});
});
显然,我已经尝试了几种不同的方法来实现它。 运行 他们通过 Karma 遇到的麻烦多于它的价值(我把那个配置留在那里以展示我尝试过的东西。)虽然我对 nodeMon 和 jasmine-nodejs 的输出很满意,但我仍然无法得到整个事情从前到后 运行 因为没有 done
功能,事情就像你期望的那样挂起。它应该就在那里,但对我来说不是。我的 package.json 包含:
{
"name": "myProject",
"version": "0.0.1",
"dependencies":{},
"devDependencies": {
"karma": "~0.13",
"karma-coverage": "~0.5",
"karma-phantomjs-launcher": "~1.0",
"karma-ng-html2js-preprocessor": "~0.1",
"phantomjs-prebuilt": "~2.1",
"grunt": "~1.0",
"grunt-contrib-clean": "~0.7",
"grunt-contrib-uglify": "~0.11",
"grunt-contrib-concat": "~0.5",
"grunt-contrib-copy": "~1.0",
"grunt-concurrent":"~2.3",
"grunt-jasmine-nodejs":"~1.5",
"grunt-jasmine-node-coverage":"0.5.0",
"grunt-open":"~0.2",
"grunt-nodemon":"~0.4",
"grunt-run-node":"~0.1",
"grunt-karma": "~0.12",
"jasmine-core": "~2.4",
"jasmine-node":"~1.14",
"karma-jasmine": "~0.3",
"karma-jasmine-matchers": "~2.0",
"karma-spec-reporter":"~0.0",
"karma-requirejs":"~1.0",
"load-grunt-tasks": "~3.4",
"uglify-js": "~2.6",
"grunt-sass": "~1.1",
"jshint":"~2.9"
},
"engines": {
"node": ">=0.12.0"
},
"scripts": {
"global": "npm i karma-cli grunt-cli -g"
}
}
谁能告诉我进程哪里缺少它需要的东西?
一个想法——你能确认你实际使用的 Jasmine 版本与你打算使用的相匹配吗?我认为 'done' 回调是在 2.0 中添加的,所以我可以看到这个错误发生在旧版本上...
编辑:您正在使用 1.3.1 版本的 "jasmine-node" 软件包,因此该功能将不可用。