【问题标题】:Mocha with chai and supertest: expected undefined to equal带有 chai 和 supertest 的 Mocha:预期未定义等于
【发布时间】:2017-12-06 13:44:00
【问题描述】:

我写了单元测试:

var app = require('../server');
var chai = require('chai');
var supertest = require("supertest")(app);
var GoogleUrl = require('google-url');
var config = require('../config');

var expect = chai.expect;

describe('Urls Tests', function () {

  var url = {
    author : 'Alexey',
    description : 'grrggr',
    full_url : 'https://github.com',
    date : '30-06-2017',
    time : '18:21:27',
    count_click : 0,
    list_tags : [
      'Sport',
      'Football'
    ]
  };

  var token;

  beforeEach(function (done) {
    agent
      .post('http://localhost:8000/auth/login')
      .send({email: 'Keane95@yandex.ru', password: '123456'})
      .end(function (err, res) {
        if (err) {
          return done(err);
        }

        expect(res.body.userData).to.have.property('token');
        token = res.body.userData.token;
        done();
      });
  });

  it('should create a url', function(done) {

      var googleUrl = new GoogleUrl({
        'key': config.get('google_key')
      });

      googleUrl.shorten(url.full_url, function (err, shortUrl) {

        url.short_url = shortUrl;

        supertest
          .post('/urls/create')
          .send(url)
          .expect(401)
          .end(function (err, res) {
            if (err) return done(err);
            expect(res.body.author).to.equal('Alexey');
            url = res.body;
            done();
          });
      });

    });

  it('should modify a url by id', function(done) {
      url.description = 'Good description';
      url.list_tags.push('Liverpool');
      supertest
        .put('/urls/' + url._id)
        .send(url)
        .expect(401)
        .end(function(err, res) {
          if (err) return done(err);
          expect(res.body.description).to.equal('Good description');
          expect(res.body.list_tags[2]).to.equal('Liverpool');
          done();
        });
    });

  it('should modify a count of clicks', function(done) {
      url.count_click++;
      supertest
        .put('/urls/' + url._id)
        .send(url)
        .expect(401)
        .end(function(err, res) {
          if (err) return done(err);
          expect(res.body).to.equal('Count of the click is updated');
          done();
        });
    });

});

我跑去执行单元测试并得到错误:

我通过单元测试阅读文章。
第一篇:http://developmentnow.com/2015/02/05/make-your-node-js-api-bulletproof-how-to-test-with-mocha-chai-and-supertest/
第二条:https://www.codementor.io/olatundegaruba/integration-testing-supertest-mocha-chai-6zbh6sefz

我不明白为什么会出现这些错误。请帮我。我认为我犯了一点错误,但因为我无法找到它。

更新
我添加了路线:

var express = require('express');
var GoogleUrl = require('google-url');
var _ = require('lodash');
var token = require('../middlewares/token');
var Url = require('../models/url');
var config = require('../config');
var router = express();

router.post('/create', token.required, createShortUrl);
router.put('/count/:id', token.required, updateCountClick);
router.put('/:id', token.required, updateUrlById);

module.exports = router;

function createShortUrl(req, res) {

    _.trim(req.body.list_tags);
    var tags = _.split(req.body.list_tags, ',');
    tags.splice(tags.length - 1, 1);

    var date = returnDate();
    var time = returnTime();

    var googleUrl = new GoogleUrl({
        'key': config.get('google_key')
    });

    googleUrl.shorten(req.body.full_url, function (err, shortUrl) {

        if (err) {
            res.status(500).json(err);
        }

        var url = new Url({
            'author': req.payload.username,
            'description': req.body.description,
            'full_url': req.body.full_url,
            'short_url': shortUrl,
            'list_tags': tags,
            'date': date,
            'time': time
        });

        url.save(function (err, url) {

            if (err) {
                return res.status(500).json(err);
            } else {
                return res.status(200).json(url);
            }

        });

    });

}

function updateCountClick(req, res) {

    var count_click = req.body.count_click + 1;

    Url.findOneAndUpdate({_id: req.params.id}, {$set: {count_click: count_click}}, {new: true}, function (err, url) {

        if (err) {
            return res.status(500).json(err);
        }

        if (url) {
            return res.status(200).json('Count of the click is updated');
        }

    });
}

function updateUrlById(req, res) {

    _.trim(req.body.list_tags);
    var tags = _.split(req.body.list_tags, ',');
    tags.splice(tags.length - 1, 1);

    Url.findOneAndUpdate({_id: req.params.id}, {$set: {description: req.body.description, list_tags: tags}}, {new: true}, function (err, url) {

        if (err) {
            res.status(500).json(err);
        }

        if (url) {
            res.status(200).json(url);
        }

    });

}

更新 2

已添加授权:

var token;

beforeEach(function (done) {
    agent
      .post('http://localhost:8000/auth/login')
      .send({email: 'Keane95@yandex.ru', password: '123456'})
      .end(function (err, res) {
        if (err) {
          return done(err);
        }

        expect(res.body.userData).to.have.property('token');
        token = res.body.userData.token;
        done();
      });
  }); 

我还更新了我的单元测试代码。

【问题讨论】:

  • 发布post('/urls/create')处理程序的代码,它似乎在401时没有发回数据。

标签: node.js unit-testing mocha.js chai supertest


【解决方案1】:

我看不到您在代码中的哪个位置发送 401 Url。因此,您的测试请求似乎被 token.required 中间件拒绝,状态码为 401(这意味着“未经授权”)。

.send(url)
.expect(401) // why do you expect 401? You never send it inside your logic

所以基本上你的测试从来没有碰到实际的代码。

首先,您确实需要伪造授权才能使token.required 中间件满意。

然后期望 200 个结果

.send(url)
.expect(200) // normal execution flow of createShortUrl results in 200
.end(/* rest of your test logic */)

【讨论】:

  • 我理解并更改了单元测试中的代码。我在其中添加了虚假授权,现在出现另一个错误:Connection refused
  • @AlexeyKorkoza 你如何将你的模型连接到数据库?您可以从浏览器访问您的路线吗?无论如何,我猜这应该是另一个问题。
  • 是的,差不多。除了/auth/login/auth/signup 之外,我还可以访问所有路线。当我尝试使用路由/auth/login/auth/signup 访问时,我得到了 404 代码。如果我运行服务器,它会毫无问题地连接。我同意我必须创建另一个问题。
猜你喜欢
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多