我正在跟随由OReilly出版的Ethan Brown撰写的使用Node和Express的Web开发教程。在第五章中,Mocha与Zombie一起用于测试基本功能,但它不起作用,并且打印出以下内容。
vagrant@vagrant-ubuntu-trusty-64:/vagrant/meadowlark/site$ mocha -u tdd -R spec qa/tests-crosspage.js
/vagrant/meadowlark/site/node_modules/bindings/bindings.js:91
throw err
^
Error: Could not locate the bindings file. Tried:
→ /vagrant/meadowlark/site/node_modules/contextify/build/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/build/Debug/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/build/Release/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/out/Debug/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/Debug/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/out/Release/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/Release/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/build/default/contextify.node
→ /vagrant/meadowlark/site/node_modules/contextify/compiled/6.3.0/linux/x64/contextify.node
at bindings (/vagrant/meadowlark/site/node_modules/bindings/bindings.js:88:9)
at Object.<anonymous> (/vagrant/meadowlark/site/node_modules/contextify/lib/contextify.js:1:96)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/vagrant/meadowlark/site/node_modules/jsdom/lib/jsdom/browser/index.js:17:21)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/vagrant/meadowlark/site/node_modules/jsdom/lib/jsdom.js:13:43)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/vagrant/meadowlark/site/node_modules/zombie/lib/zombie/resources.js:11:8)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/vagrant/meadowlark/site/node_modules/zombie/lib/zombie/index.js:6:13)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/vagrant/meadowlark/site/qa/tests-crosspage.js:1:77)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:220:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:217:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:469:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:404:18)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Module.runMain (module.js:575:10)
at run (bootstrap_node.js:352:7)
at startup (bootstrap_node.js:144:9)
at bootstrap_node.js:467:3
根据书中的&#34;代码中的建议不起作用?&#34; github link的部分我已使用ch05文件夹中package.json
中列出的版本重新安装了所有依赖项。仍有同样的问题,我决定实施下一个测试工作正常。
vagrant@vagrant-ubuntu-trusty-64:/vagrant/meadowlark/site$ mocha -u tdd -R spec qa/tests-unit.js
Fortune cookie tests
✓ getFortune() should return a fortune
1 passing (16ms)
质量保证章节的下一部分涵盖了Grunt,由于同样的错误,我无法开始工作。我已经将Ethan的git repo克隆到一个单独的目录中,重新安装所有依赖项,运行服务器,运行测试并最终看到正确的Mocha输出。
我尝试在我的某些文件中使用diff
来对抗Ethan,并且没有发现任何错误的罪魁祸首......只是编码风格的差异和尾随空格。
此处列出了可能导致问题的文件及其内容。
tests-crosspages.js
var Browser = require('zombie'),
assert = require('chai').assert;
var browser;
suite('Cross-Page Tests', function(){
setup(function(){
browser = new Browser();
});
test('requesting a group rate quote from the hood river tour page ' +
'should populate the referrer field', function(done){
var referrer = 'http://localhost:3000/tours/hood-river';
browser.visit(referrer, function(){
browser.clickLink('.requestGroupRate', function(){
assert(browser.field('referrer').value === referrer);
done();
});
});
});
test('requesting a group rate from the oregon coast tour page should ' +
'populate the referrer field', function(done){
var referrer = 'http://localhost:3000/tours/oregon-coast';
browser.visit(referrer, function(){
browser.clickLink('.requestGroupRate', function(){
assert(browser.field('referrer').value === referrer);
done();
});
});
});
test('visiting the "request groupe rate" page directly should result ' +
'in an empty referrer field', function(done){
browser.visit('http://localhost:3000/tours/request-group-rate',
function(){
assert(browser.field('referrer').value === '');
done();
});
});
});
meadowlark.js
var express = require('express');
var fortune = require('./lib/fortune.js');
var app = express();
// set up handlebars view engine
var handlebars = require('express3-handlebars').create({
defaultLayout:'main',
helpers: {
section: function(name, options){
if(!this._sections) this._sections = {};
this._sections[name] = options.fn(this);
return null;
}
}
});
app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');
app.set('port', process.env.PORT || 3000);
app.use(express.static(__dirname + '/public'));
// set 'showTests' context property if the querystring contains test=1
app.use(function(req, res, next){
res.locals.showTests = app.get('env') !== 'production' &&
req.query.test === '1';
next();
});
app.get('/', function(req, res){
res.render('home');
});
app.get('/about', function(req, res){
res.render('about', {
fortune: fortune.getFortune(),
pageTestScript: '/qa/tests-about.js'
});
});
app.get('/tours/hood-river', function(req, res){
res.render('tours/hood-river');
});
app.get('/tours/request-group-rate', function(req, res){
res.render('tours/request-group-rate');
});
// custom 404 page
app.use(function(req, res, next){
res.status(404);
res.render('404');
});
// custom 500 page
app.use(function(err, req, res, next){
console.error(err.stack);
res.status(500);
res.render('500');
});
app.listen(app.get('port'), function(){
console.log( 'Express started on http://localhost:' +
app.get('port') + '; press Ctrl-C to terminate.' );
});