使用 Chai 进行单元测试时,"TypeError: Cannot read property 'address' of undefined"是什么意思?



当使用chai进行单元测试时,我一直得到这个错误消息,尽管它们应该通过,但没有一个测试通过。在这种情况下它是什么意思?谢谢。

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)

与其使用app不如使用:

chai.request('http://localhost:1234')
  .get('/items')

这个问题最有可能是变量app,实际上是未定义的,因为这个错误是在这种情况下抛出的,你需要检查你是否正确导入了你的server.js文件,它包含了你的服务器应用程序的实例属性app

发现了问题:首先必须确保我正在测试的文件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或从一个必须编写测试用例的文件中运行服务器,上面的代码是为了简单理解示例代码。

相关内容

最新更新