When unit testing with Chai, what does "TypeError: Cannot read property 'address' of undefined" mean?
When unit testing with Chai, what does "TypeError: Cannot read property 'address' of undefined" mean?
当使用 chai 进行单元测试时,我不断收到此错误消息,并且 none 测试通过了,尽管它们应该通过。在这种情况下是什么意思?
谢谢
var chai = require('chai');
var chaiHttp = require('chai-http');
var server = require('../server.js');
var should = chai.should();
var app = server.app;
var storage = server.storage;
chai.use(chaiHttp);
describe('Shopping List', function() {
it('should list items on GET', function(done) {
chai.request(app)
.get('/items')
.end(function(err, res) {
res.should.have.status(200);
res.should.be.json; // jshint ignore:line
res.body.should.be.a('array');
res.body.should.have.length(3);
res.body[0].should.be.a('object');
res.body[0].should.have.property('id');
res.body[0].should.have.property('name');
res.body[0].id.should.be.a('number');
res.body[0].name.should.be.a('string');
res.body[0].name.should.equal('Broad beans');
res.body[1].name.should.equal('Tomatoes');
res.body[2].name.should.equal('Peppers');
done();
});
});
完整的错误信息:
1) Shopping List should list items on GET:
TypeError: Cannot read property 'address' of undefined
at serverAddress (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:252:17)
at new Test (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:244:53)
at Object.obj.(anonymous function) [as get] (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:216:14)
at Context.<anonymous> (test-server.js:14:8)
尝试使用以下应用代替应用:
chai.request('http://localhost:1234')
.get('/items')
问题最有可能是实际上未定义的变量 app
,因为在这种情况下会抛出此错误,您需要检查是否正确导入了 server.js 文件,并且它包含 属性 带有服务器应用程序实例的应用程序。
发现问题:首先必须确保我正在测试的文件 server.js 已正确导出到 test.js 文件。
我也忘了将 test.js 文件放在单独的测试文件夹中。我希望错误信息不是那么含糊。当我努力修复代码本身时,让我陷入困境。
让我们看看底层是如何工作的
您有一些基本服务器请求,如下所示
=> server.js
let server = app.listen(3000, function () {
console.log('node server running')
});
现在你的规范文件保留在这样的地方=> test/test.js
let request = require('request');
let chai = require('chai');
let assert = require('chai').assert;
let expect = require('chai').expect;
let server = require('../server');
// don't .js extension, common js handles it perfectly
let should = chai.should();
let chaiHttp = require('chai-http');
chai.use(chaiHttp);
describe("/GET all books",() => {
it('should return status 200 ', (done) => {
// dont forget done params
//or else it will always give u test pass even if it is wrong
//assertion
chai.request(server)
.get('/books/something/?q=something&num=23') // chai makes it easy..
.end((err, res) => {
should.not.exist(err);
should.exist(res); // note that u should check for res existance
res.should.have.status(200);
done();
});
});
});
因此,而不是 chai .request(app)
,它应该是 chai.request(server)
到 运行 来自 app.js 的服务器或来自必须编写测试用例的文件,以上代码是为了简单理解示例代码。
当使用 chai 进行单元测试时,我不断收到此错误消息,并且 none 测试通过了,尽管它们应该通过。在这种情况下是什么意思? 谢谢
var chai = require('chai');
var chaiHttp = require('chai-http');
var server = require('../server.js');
var should = chai.should();
var app = server.app;
var storage = server.storage;
chai.use(chaiHttp);
describe('Shopping List', function() {
it('should list items on GET', function(done) {
chai.request(app)
.get('/items')
.end(function(err, res) {
res.should.have.status(200);
res.should.be.json; // jshint ignore:line
res.body.should.be.a('array');
res.body.should.have.length(3);
res.body[0].should.be.a('object');
res.body[0].should.have.property('id');
res.body[0].should.have.property('name');
res.body[0].id.should.be.a('number');
res.body[0].name.should.be.a('string');
res.body[0].name.should.equal('Broad beans');
res.body[1].name.should.equal('Tomatoes');
res.body[2].name.should.equal('Peppers');
done();
});
});
完整的错误信息:
1) Shopping List should list items on GET:
TypeError: Cannot read property 'address' of undefined
at serverAddress (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:252:17)
at new Test (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:244:53)
at Object.obj.(anonymous function) [as get] (/home/ubuntu/workspace/thinkful-node-course/unit2/node_modules/chai-http/lib/request.js:216:14)
at Context.<anonymous> (test-server.js:14:8)
尝试使用以下应用代替应用:
chai.request('http://localhost:1234')
.get('/items')
问题最有可能是实际上未定义的变量 app
,因为在这种情况下会抛出此错误,您需要检查是否正确导入了 server.js 文件,并且它包含 属性 带有服务器应用程序实例的应用程序。
发现问题:首先必须确保我正在测试的文件 server.js 已正确导出到 test.js 文件。
我也忘了将 test.js 文件放在单独的测试文件夹中。我希望错误信息不是那么含糊。当我努力修复代码本身时,让我陷入困境。
让我们看看底层是如何工作的
您有一些基本服务器请求,如下所示
=> server.js
let server = app.listen(3000, function () {
console.log('node server running')
});
现在你的规范文件保留在这样的地方=> test/test.js
let request = require('request');
let chai = require('chai');
let assert = require('chai').assert;
let expect = require('chai').expect;
let server = require('../server');
// don't .js extension, common js handles it perfectly
let should = chai.should();
let chaiHttp = require('chai-http');
chai.use(chaiHttp);
describe("/GET all books",() => {
it('should return status 200 ', (done) => {
// dont forget done params
//or else it will always give u test pass even if it is wrong
//assertion
chai.request(server)
.get('/books/something/?q=something&num=23') // chai makes it easy..
.end((err, res) => {
should.not.exist(err);
should.exist(res); // note that u should check for res existance
res.should.have.status(200);
done();
});
});
});
因此,而不是 chai .request(app)
,它应该是 chai.request(server)
到 运行 来自 app.js 的服务器或来自必须编写测试用例的文件,以上代码是为了简单理解示例代码。