ReferenceError: อธิบายไม่ได้กำหนด NodeJs


160

nodejsฉันพยายามที่จะกำหนดจุดปลายบางและทำการทดสอบการใช้ ในserver.jsฉันมี:

var express = require('express');
var func1 = require('./func1.js');
var port = 8080;
var server = express();

server.configure(function(){
  server.use(express.bodyParser());
});

server.post('/testend/', func1.testend);

และในfunc1.js:

    var testend = function(req, res) {
           serialPort.write("1", function(err, results) {
           serialPort.write("2" + "\n", function(err, results) {
           });
      });
   });
    exports.testend = testend;

ตอนนี้test.jsฉันกำลังพยายามใช้จุดปลายนี้:

var should = require('should');
var assert = require('assert');
var request = require('supertest');
var http = require('http');
var app = require('./../server.js');
var port = 8080;

describe('Account', function() {
        var url = "http://localhost:" + port.toString();
        it('test starts', function(done) {
                request(url).post('/testend/')
                // end handles the response
                .end(function(err, res) {
                        if (err) {
                                throw err;
                        }
                        res.body.error.should.type('string');
                        done();
                });
        });
});

แต่เมื่อฉันเรียกใช้node test.jsฉันได้รับข้อผิดพลาดนี้:

อธิบาย ('บัญชี', ฟังก์ชั่น () {
^

ReferenceError: อธิบายไม่ได้กำหนดไว้
    ที่วัตถุ (/test/test.js:9:1)
    ที่ Module._compile (module.js: 456: 26)
    ที่ Object.Module._extensions..js (module.js: 474: 10)
    ที่ Module.load (module.js: 356: 32)
    ที่ Function.Module._load (module.js: 312: 12)
    ที่ Function.Module.runMain (module.js: 497: 10)
    เมื่อเริ่มต้น (node.js: 119: 16)
    ที่ node.js: 906: 3

ฉันจะแก้ไขปัญหาได้อย่างไร


1
คุณคาดหวังอะไรdescribe()และอยู่ตรงไหน ในการดูไฟล์ test.js ของคุณจะไม่มีสัญลักษณ์describeที่ถูกกำหนดไว้ที่นั่น
jfriend00

1
อธิบาย () เป็นส่วนหนึ่งของจัสมิน
Keith Tyler

1
ช่องว่างเอกสารที่นำไปสู่คำถามนี้ได้รับการแก้ไขในเดือนพฤศจิกายน 2559แต่อาจจะทำให้เว็บไซต์นี้มีการเปิดตัวรุ่น 4.1.0 เมื่อเร็ว ๆ นี้เท่านั้น
devius

คำตอบ:


197

สมมติว่าคุณกำลังทดสอบผ่านmochaคุณต้องเรียกใช้การทดสอบของคุณโดยใช้mochaคำสั่งแทนการnodeปฏิบัติการ

npm install mocha -gดังนั้นหากคุณยังไม่ได้ให้แน่ใจว่าคุณทำ จากนั้นเพียงแค่เรียกใช้mochaในไดเรกทอรีรากของโครงการ


16
ถ้าฉันต้องการให้ฟังก์ชัน mocha พร้อมใช้งานกับโหนด
abhisekp

12
เอกสารที่มอคค่าmochajs.orgแปลกประหลาดไม่ได้กล่าวถึงนี้ ...
ริชาร์ด Ev

3
ไม่จำเป็นต้องติดตั้ง mocha ทั่วโลกเพียงใช้"test": "./node_modules/.bin/mocha -V"ในส่วนสคริปต์ของ package.json และติดตั้ง
mocha เป็นการ

2
@LukasLiesis ไม่จำเป็นต้องใช้./node_modules/.binเส้นทางนี้โหลดแล้วเมื่อคุณใช้npm runหรือyarnดังนั้นเพียงแค่ "test": "mocha -V" จะพอเพียง
Felipe Sabino

@FelipeSabino ขอบคุณที่ชี้ให้เห็นสิ่งนี้ แต่เมื่อคุณมีเพียงmocha -Vไม่ชัดเจนว่ามันถูกโหลดจากทั่วโลกหรือในพื้นที่นั่นเป็นสาเหตุที่ฉันยังคงต้องการแสดงเส้นทางแม้ว่าระบบจะไม่จำเป็นต้องใช้
Lukas Liesis

132

หากคุณกำลังใช้ vscode ต้องการดีบักไฟล์ของคุณ

ฉันใช้tddก่อนมันโยนReferenceError: describe is not defined

แต่เมื่อฉันใช้bddมันใช้งานได้!

เสียเวลาครึ่งวันในการแก้ปัญหา ....

    {
      "type": "node",
      "request": "launch",
      "name": "Mocha Tests",
      "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
      "args": [
        "-u",
        "bdd",// set to bdd, not tdd
        "--timeout",
        "999999",
        "--colors",
        "${workspaceFolder}/test/**/*.js"
      ],
      "internalConsoleOptions": "openOnSessionStart"
},

ว้าว! เห็นสิ่งนี้หลังจากเพิ่งแก้ปัญหา
nonybrighto

ขอบคุณ! ช่วยฉันได้มากเวลา!
แบรด W

สิ่งนี้ก็เป็นจริงสำหรับ WebStorm (ซึ่งแปลก)
yentsun

4
ขอบคุณสำหรับคำตอบทำให้ทุกอย่างทำงานได้ !! มันทำงานอย่างไร การเปลี่ยน tdd เป็น bdd ช่วยแก้ปัญหาอย่างไร
TedTran2019

6
bdd vs tdd คือ 'รูปแบบการทดสอบ' ที่ส่งผ่านไปยัง mocha ผ่านอาร์กิวเมนต์คำสั่ง bdd เป็นค่าเริ่มต้น แต่ vscode ที่สร้างเท็มเพลตใช้ tdd คุณอาจใช้ bdd เนื่องจากคำแนะนำในการเริ่มต้นใช้ bdd เป็นส่วนใหญ่ ทำไม vscode ใช้ tdd เป็นค่าเริ่มต้นเมื่อ bdd เป็นค่าเริ่มต้นอยู่นอกเหนือฉัน
Ryan The Leach

47

ในการรันการทดสอบด้วย node / npm โดยไม่ต้องติดตั้ง Mocha ทั่วโลกคุณสามารถทำได้:

•ติดตั้ง Mocha ในโครงการของคุณ ( npm install mocha --save-dev)

•เลือกติดตั้งไลบรารีการยืนยัน ( npm install chai --save-dev)

•ในของคุณpackage.jsonเพิ่มส่วนscriptsและกำหนดเป้าหมายไบนารีมอคค่า

"scripts": {
  "test": "node ./node_modules/mocha/bin/mocha"
}

•ใส่ไฟล์ข้อมูลจำเพาะของคุณในไดเรกทอรีที่มีชื่อ/testในไดเรกทอรีรากของคุณ

•ในไฟล์ข้อมูลจำเพาะของคุณให้นำเข้าไลบรารีการยืนยัน

var expect = require('chai').expect;

•คุณไม่จำเป็นต้องนำเข้ามอคค่าเรียกใช้mocha.setupหรือโทรmocha.run()

•จากนั้นเรียกใช้สคริปต์จากรูทโปรเจคของคุณ:

npm test

7
ในบรรทัดทดสอบของคุณคุณไม่ต้องชี้ไปที่โฟลเดอร์ mocha bin อีกต่อไปเพียงแค่ใส่mochaมันก็จะทำงานได้
Adrian Lynch

1
หากคุณต้องการให้คำสั่งนี้เรียกใช้การทดสอบทั้งหมดในไดเรกทอรี '/ test' รวมถึงไดเรกทอรีย่อยให้ใส่mocha --recursive
Luke Gallione

1
@AdrianLynch: สองปีแล้ว แต่มีบางอย่างที่แตกต่างหรือเปลี่ยนแปลงไป ไม่มีพี่ใหญ่ แต่อาจจะช่วยใครซักคน ฉันใช้ Windows 10 ที่มี Mocha 4.01 ติดตั้งอยู่ทั่วโลก ฉันต้องชี้ไปที่ mocha \ bin \ mocha อย่างที่โน้ตของ cantera พูด
BaldEagle

สำหรับฉันในการทำงานฉันต้องรวมโฟลเดอร์เป้าหมายเช่นนี้:{"scripts": { "test": "node ./node_modules/mocha/bin/mocha --recursive test" }}
Alwin Kesler

22

คุณสามารถทำสิ่งนี้:

  var mocha = require('mocha')
  var describe = mocha.describe
  var it = mocha.it
  var assert = require('chai').assert

  describe('#indexOf()', function() {
    it('should return -1 when not present', function() {
      assert.equal([1,2,3].indexOf(4), -1)
    })
  })

การอ้างอิง: http://mochajs.org/#require


จากการอ้างอิง> อินเตอร์เฟสที่ต้องการไม่สามารถรันผ่านโหนดที่สามารถเรียกใช้งานได้และต้องรันผ่านมอคค่า คำถามที่ถามเกี่ยวกับการทำงานผ่านโหนด
eighteyes

1
ฉันเขียนในภายหลังและมีประสบการณ์ที่แตกต่าง ในกรณีที่ช่วยใครบางคน ... ฉันใช้ Windows 10 ที่ติดตั้ง mocha 4.01 และ chai 4.1.2 ทั่วโลกแล้ว ฉันไม่ต้องการตัวแปรสามตัวแรกที่นี่; ฉันต้องการที่สี่ @eighteyes: ฉันไม่พบวิธีการเรียกใช้ Mocha โดยตรง ฉันกำลังทำงานผ่าน "node <full path to mocha \ bin \ mocha> <พา ธ สัมพัทธ์เพื่อทดสอบไฟล์>"
BaldEagle

1
var mocha = require('mocha') var describe = mocha.describe var it = mocha.itนี่ซ้ำซ้อนจริง ๆ คุณสามารถกำหนดvar {describe, it} = require('mocha') ES6 destructuring ได้
user5532169

6

ฉันมีข้อผิดพลาดนี้เมื่อใช้ "--ui tdd" ลบสิ่งนี้หรือใช้ปัญหาการแก้ไข "--ui bdd"


5

OP ถามเกี่ยวกับการทำงานจากการไม่ได้มาจากnode mochaนี่เป็นกรณีที่ใช้กันอย่างแพร่หลายดูการใช้มอคค่าเชิงโปรแกรม

นี่คือสิ่งที่ฉีดอธิบายและมันเป็นการทดสอบของฉัน

mocha.ui('bdd').run(function (failures) {
    process.on('exit', function () {
      process.exit(failures);
    });
  });

ฉันพยายามtddเหมือนในเอกสาร แต่นั่นไม่ได้ผล bdd ทำงานแม้ว่า


ขอบคุณมาก! ในขณะที่ฉันรู้ว่าdescribeมีเฉพาะ BDD และไม่สามารถใช้กับ 'TDD' ได้ แต่อย่างใดในสคริปต์การตั้งค่าฉันใช้ TDD และคิดอยู่เสมอว่าฉันกำหนดค่าเป็น 'BDD' การค้นหาทางอินเทอร์เน็ตไม่มีความช่วยเหลือเนื่องจากการรับรู้ของฉันคือฉันตั้งค่าที่ถูกต้อง (BDD) แต่ฉันยังคงได้รับข้อผิดพลาด เป็นเพียงโซลูชันของคุณ (ซึ่งไม่เหมือนใครจากโซลูชันอื่น ๆ ที่พบในผลการค้นหาทางอินเทอร์เน็ต) ทำให้ฉันเพิ่มรหัสเพิ่มเติมที่ทำให้การตั้งค่าผิดของฉันมากเกินไปและในที่สุดก็ใช้งานได้ เฉพาะในระหว่างการตั้งค่าอื่น ๆ ฉันเห็นตัวพิมพ์ & หลังจากแก้ไขเป็น 'BDD' ไม่จำเป็นต้องใช้รหัสด้านบน
VanagaS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.