Запускать тесты мокки в тестовой среде?

Я не могу сказать, что мокка запускает свой тестовый пакет в тестовой среде.

app.js

app.configure('test', function(){
  app.set('port', 3002);
});

Тест /some -test.coffee

app = require('../../app')

process.env.NODE_ENV = 'test'

describe 'some test', ->
  it 'should pass', ->

Поскольку я требую приложения, когда я запускаю тесты, я ожидаю увидеть

Express server listening on port 3002

и вместо этого я вижу

Express server listening on port 3000

Установка другого номера порта в блоке конфигурации разработки в app.js дает

Express server listening on port [whatever port I set in development block in app.js]

Я не могу заставить свои тесты работать в тестовой среде. Любые предложения?

Ответы

Ответ 1

  • Вам нужно определить NODE_ENV, прежде чем вам понадобится app.js:

    process.env.NODE_ENV = 'test'
    
    app = require('../../app')
    
    describe 'some test', ->
      it 'should pass', ->
    
  • Вы не можете изменить порт прослушивания на app.set. Есть только один способ установить порт - передать его в метод listen. Вы можете сделать что-то вроде этого:

    var express = require('express');
    var app = express();
    
    app.get('/', function(req, res){
      res.send('hello world');
    });
    
    var port = 3000;
    
    app.configure('test', function(){
      port = 3002;
    });
    
    app.listen(port);
    

Ответ 2

Я бы выбрал другой подход от Вадима. Используя пример Vadim, вы можете вместо этого загрузить настройки среды на основе вашего значения process.env.NODE_ENV. Я знаю, что в моем подходе есть еще один шаг, но он более чист, расширяем и предотвратит добавление тестовых условностей в вашу логику.

Этот подход использует dotenv, а затем определяет как файл default, так и test в корне приложения. Эти файлы позволят вам перенастроить свойства в приложении без изменения вашего JavaScript.

  • Добавьте dotenv как dependency в ваш файл package.json, затем установите новые пакеты в папку node_modules:

    package.json

    {
      ...
      "dependencies": {
        ...
        "dotenv": "0.2.8"
      }
    }
    

    командной строки

    $ npm install
    
  • Измените свой app.js так, чтобы порт использовал значение среды, установленное из загруженного файла .env.

    // Load .env files from root based on the NODE_ENV value
    require('dotenv').load();
    
    var express = require('express');
    var app = express();
    
    app.get('/', function(req, res){
      res.send('hello world');
    });
    
    var port = process.env.port || 3000;
    -----------^
    
    app.listen(port);
    
  • Создайте два файла в корне вашей папки, .env и .env.test, просто добавьте одну строку ниже. Эти файлы имеют простые пары значений ключа в каждой строке, к которым можно получить доступ, если префикс с process.env..

    .env

    port=3000
    

    .env.test

    port=3002
    
  • Из командной строки или при вызове ваших тестов я бы установил NODE_ENV:

    $ NODE_ENV=test mocha <TEST_FOLDER>/*.js
      ---------^
    

При запуске приложения во всех других случаях без установки NODE_ENV значения в файле .env по умолчанию будут загружены в process.env.