ReferenceError: opisać nie zdefiniowano NodeJs

160

Próbuję zdefiniować niektóre punkty końcowe i wykonać test przy użyciu nodejs. W server.jsmam:

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

i w func1.js:

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

Teraz test.jspróbuję użyć tego punktu końcowego:

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

Ale kiedy uruchamiam, pojawia node test.jssię ten błąd:

opisać ('Konto', funkcja () {
^

ReferenceError: opis nie jest zdefiniowany
    w Object. (/test/test.js:9:1)
    w Module._compile (module.js: 456: 26)
    w Object.Module._extensions..js (module.js: 474: 10)
    w Module.load (module.js: 356: 32)
    w Function.Module._load (module.js: 312: 12)
    w Function.Module.runMain (module.js: 497: 10)
    podczas uruchamiania (node.js: 119: 16)
    w node.js: 906: 3

Jak mogę rozwiązać ten problem?

N34
źródło
1
Kim spodziewasz describe()się być i gdzie to jest zdefiniowane? Patrząc na plik test.js, nie ma tam żadnego describezdefiniowanego symbolu .
jfriend00
1
opisać () jest częścią Jasmine.
Keith Tyler
1
Luka w dokumentacji, która doprowadziła do tego pytania, została naprawiona w listopadzie 2016 r. , Ale prawdopodobnie pojawiła się na stronie dopiero niedawno wraz z wydaniem wersji 4.1.0.
devius

Odpowiedzi:

197

Zakładając, że testujesz przez mocha, musisz uruchomić testy za pomocą mochapolecenia zamiast nodepliku wykonywalnego.

Więc jeśli jeszcze tego nie zrobiłeś, upewnij się, że tak npm install mocha -g. Następnie po prostu uruchom mochaw katalogu głównym projektu.

mscdex
źródło
16
A jeśli chcę, aby funkcje mokka były dostępne dla węzła?
abhisekp
12
Docs mokka na mochajs.org wyjątkowo nie wspomnieć o tym ...
Richard Ev
3
nie ma potrzeby instalacji globalnej mokki, po prostu użyj "test": "./node_modules/.bin/mocha -V"w sekcji skryptów pakietu package.json i zainstaluj mokkę jako jeszcze jedną zależność
Lukas Liesis
2
@LukasLiesis nie ma takiej potrzeby ./node_modules/.bin, ta ścieżka jest już załadowana, gdy używasz, npm runlub yarnpo prostu "test": "mocha -V" wystarczy
Felipe Sabino
@FelipeSabino dzięki za wskazanie tego, ale kiedy już masz mocha -V, nie jest jasne, czy zostało załadowane z globalnego czy lokalnego, dlatego nadal wolę pokazywać ścieżkę, nawet jeśli nie jest wymagana przez system
Lukas Liesis
132

jeśli używasz vscode, chcesz debugować swoje pliki

Używałem tddwcześniej, rzucamReferenceError: describe is not defined

Ale kiedy używam bdd, to działa!

marnować pół dnia, aby go rozwiązać ...

    {
      "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"
},
toffi
źródło
Łał! widząc to po rozwiązaniu problemu.
nonybrighto
Dziękuję Ci! Zaoszczędziłeś mi dużo czasu!
Brad W,
Dotyczy to również WebStorm (co jest dziwne)
yentsun
4
Dzięki za odpowiedź, wszystko działało !! Jak to jednak działa? W jaki sposób zmiana tdd na bdd rozwiązuje problem?
TedTran2019
6
bdd vs tdd to `` styl testowy '' przekazywany do mokki za pośrednictwem argumentów poleceń, bdd jest wartością domyślną, ale szablon wygenerowany przez vscode używa tdd. Prawdopodobnie używasz bdd, ponieważ większość podręczników dla początkujących używa bdd. Dlaczego vscode używa domyślnie tdd, kiedy bdd jest domyślnym, jest poza mną.
Ryan The Leach
47

Aby uruchomić testy z node / npm bez globalnej instalacji Mocha, możesz to zrobić:

• Zainstaluj Mocha lokalnie w swoim projekcie ( npm install mocha --save-dev)

• Opcjonalnie zainstaluj bibliotekę potwierdzeń ( npm install chai --save-dev)

package.jsonDodaj sekcję do pliku scriptsbinarnego mokka i kieruj na niego

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

• Umieść swoje pliki specyfikacji w katalogu o nazwie /testw katalogu głównym

• W plikach specyfikacji zaimportuj bibliotekę potwierdzeń

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

• Użytkownik nie trzeba mokka importu, biegu mocha.setuplub zadzwońmocha.run()

• Następnie uruchom skrypt z katalogu głównego projektu:

npm test
cantera
źródło
7
W linii testowej nie musisz już wskazywać folderu pojemnika mocha, po prostu powiedz mocha, zadziała.
Adrian Lynch
1
Jeśli chcesz, aby to polecenie uruchomiło wszystkie testy w katalogu '/ test', w tym podkatalogach, wpiszmocha --recursive
Luke Gallione
1
@AdrianLynch: Minęły już dwa lata, ale coś się zmieniło lub zmieniło. No biggee, ale może to komuś pomoże. Korzystam z Windows 10 z Mocha 4.01 zainstalowanym na całym świecie. Muszę wskazać na mokkę \ bin \ mocha, jak mówi notatka cantery.
BaldEagle
Aby móc pracować, musiałem dołączyć folder docelowy w następujący sposób:{"scripts": { "test": "node ./node_modules/mocha/bin/mocha --recursive test" }}
Alwin Kesler,
22

Możesz też zrobić tak:

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

Źródła: http://mochajs.org/#require

subhojit777
źródło
Z ref> Wymagany interfejs nie może być uruchamiany przez plik wykonywalny węzła i musi być uruchamiany za pośrednictwem mokki. Pytanie dotyczy uruchamiania przez węzeł.
osiem oczu
1
Piszę później i mam inne doświadczenie. Na wypadek, gdyby to komuś pomogło ... Jestem na Windows 10 z mocha 4.01 i chai 4.1.2 zainstalowanymi globalnie. Nie potrzebuję tutaj pierwszych trzech zmiennych; Potrzebuję czwartego. @eighteyes: Nie udało mi się bezpośrednio uruchomić Mocha. Uruchamiam przez „węzeł <pełna ścieżka do mokka \ bin \ mocha> <względna ścieżka do pliku testowego>”.
BaldEagle
1
var mocha = require('mocha') var describe = mocha.describe var it = mocha.itto jest w rzeczywistości zbędne. Możesz var {describe, it} = require('mocha')z przypisaniem do niszczenia
użytkownik5532169
6

mam ten błąd podczas używania „--ui tdd”. usuń to lub używając "--ui bdd" napraw problem.

GraySe7en
źródło
5

OP zapytał o ucieczkę z nodenie z mocha. Jest to bardzo częsty przypadek użycia, zobacz programowe używanie mokki

Tak opisuję wtryski i to w moich testach.

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

Próbowałem tddjak w dokumentach, ale to nie zadziałało, bdd działało chociaż.

osiem oczu
źródło
Dziękuję Ci bardzo! Chociaż zdaję sobie sprawę, że describejest dostępny tylko z BDD i nie jest dostępny dla 'TDD', w jakiś sposób w skrypcie instalacyjnym użyłem TDD i myślałem, że skonfigurowałem jako 'BDD'. Wyszukiwanie w Internecie nie pomaga, ponieważ moim zdaniem wykonałem poprawną konfigurację (BDD), ale nadal pojawia się błąd. To tylko Twoje rozwiązanie (które jest unikalne wśród innych rozwiązań znalezionych w wynikach wyszukiwania w Internecie) sprawiło, że dodałem dodatkowy kod, który zastąpił moje złe ustawienie i ostatecznie zadziałał. Dopiero podczas innych ustawień konfiguracji widziałem swoją literówkę i po poprawieniu jej na 'BDD' powyższy kod nie był wymagany.
VanagaS