簡體   English   中英

帶有chai和supertest的摩卡:預期未定義等於

[英]Mocha with chai and supertest: expected undefined to equal

我寫了單元測試:

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

Authoziration已添加:

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();
      });
  }); 

我也更新了單元測試的代碼。

我看不到您將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 */)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM