麻烦运行使用grunt静态服务器的Qunittesting

通过networking浏览器运行testing工作正常,但使用grunt给我错误。 我很难理解我在这里做错了什么。 grunt tests失败

 $ grunt tests Running "jsonlint:sample" (jsonlint) task >> 4 files lint free. Running "jshint:all" (jshint) task >> 4 files lint free. Running "connect:server" (connect) task Started connect web server on http://localhost:5000 Running "qunit:all" (qunit) task Testing http://localhost:5000/tests/tests.html F >> Settings.json tests - Fetching settings file >> Message: InvalidStateError: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable. >> Actual: null >> Expected: undefined >> http://localhost:5000/tests/tests.js:7 >> Settings.json tests - Fetching settings file >> Message: Check settings JSON file >> http://localhost:5000/tests/tests.js:25:24 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings file >> Message: Assertion after the final `assert.async` was resolved >> Actual: null >> Expected: undefined >> notEqual@http://localhost:5000/tests/qunit/qunit-1.22.0.js:1512:18 >> http://localhost:5000/tests/tests.js:25:24 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings file >> Message: Check settings JSON file >> http://localhost:5000/tests/tests.js:25:24 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings file >> Message: Too many calls to the `assert.async` callback >> Actual: null >> Expected: undefined >> http://localhost:5000/tests/tests.js:26:13 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings file >> Message: Assertion after the final `assert.async` was resolved >> Actual: null >> Expected: undefined >> notEqual@http://localhost:5000/tests/qunit/qunit-1.22.0.js:1512:18 >> http://localhost:5000/tests/tests.js:25:24 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings file >> Message: Check settings JSON file >> http://localhost:5000/tests/tests.js:25:24 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 >> Settings.json tests - Fetching settings >> Message: Too many calls to the `assert.async` callback >> Actual: null >> Expected: undefined >> http://localhost:5000/tests/tests.js:26:13 >> onreadystatechange@http://localhost:5000/tests/tests.js:8:25 Warning: 8/8 assertions failed (54ms) Use --force to continue. Aborted due to warnings. 

Gruntfile.js

 module.exports = function(grunt) { grunt.initConfig({ jsonlint: { sample: { src: ['json/*.json', 'api_files/*.json'], options: { formatter: 'prose' } } }, jshint: { all: ['*.js', 'tests/*.js', 'server/*.js'] }, connect: { server: { options: { port: 5000, base: '.' } } }, qunit: { all: { options: { urls: [ 'http://localhost:5000/tests/tests.html' ] } } } }); grunt.loadNpmTasks('grunt-jsonlint'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.registerTask('tests', ['jsonlint', 'jshint', 'connect', 'qunit']); }; 

tests.html

 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Backend Tests</title> <link rel="stylesheet" href="qunit/qunit-1.22.0.css"> <script src="qunit/qunit-1.22.0.js"></script> </head> <body> <div id="qunit"></div> <div id="qunit-fixture"></div> <script src="tests.js"></script> </body> </html> 

tests.js

 var HttpClient = function () { this.get = function (requestUrl, callback) { var anHttpRequest = new XMLHttpRequest(); anHttpRequest.onreadystatechange = function () { if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200) { callback(anHttpRequest.responseText); } else if (anHttpRequest.status == 404) { callback(null); } }; anHttpRequest.open("GET", requestUrl, true); anHttpRequest.send(null); }; }; var rootUrl = "http://localhost:5000"; var client = new HttpClient(); QUnit.module("Fetching settings.json"); QUnit.test('Fetching settings file', function (assert) { var done = assert.async(); client.get(rootUrl + '/api/settings', function (response) { assert.notEqual(response, null, 'Check settings JSON file'); done(); }); }); 

main.js

 function serveStaticFiles(router) { var app = express(); app.use('/api', router); // all of our routes will be prefixed with /api app.use('/', express.static(__dirname + '/')); // Makes it possible for html files to fetch images from img app.use(express.static('./html')); // folder 'html' is now considered public and accessible app.use(express.static('./xml')); // folder 'xml' is now considered public and accessible app.use(express.static('./img')); // folder 'img' is now considered public and accessible app.use(express.static('./json')); // folder 'json' is now considered public and accessible app.use(express.static('./tests')); // folder 'tests' is now considered public and accessible return app; } var bugsnag = require("bugsnag"); bugsnag.register(process.env.BUGSNAG_API_KEY); bugsnag.releaseStage = process.env.BUGSNAG_RELEASE_STAGE; bugsnag.notifyReleaseStages = ["stage", "production"]; var express = require('express'); var router = express.Router(); var app = serveStaticFiles(router); var port = process.env.PORT || 5000; var server = app.listen(port); var apiHandler = require("./server/ApiHandler"); console.log("Application created and it listens on port " + port); apiHandler.initRestApi(router); 

您将需要运行您的节点服务器作为您的咕噜声进程中的另一个步骤。 专门运行Express服务器的任务非常繁重,我build议从那里开始。 下面是gruntconfiguration的样子:

 grunt.initConfig({ // ... express: { // this is the new task... dev: { options: { script: 'path/to/main.js' } } }, connect: { server: { options: { port: 3000, // I changed this so it doesn't conflict with your express app base: '.' } } }, qunit: { all: { options: { urls: [ 'http://localhost:3000/tests/tests.html' // changed this as well ] } } } }); 

然后,您将要运行所有三个任务作为您的“testing”运行。 你可以像这样创build一个别名:

grunt.registerTask('tests', ['jsonlint', 'jshint', 'express', 'connect', 'qunit']);