Как протестировать модули ES6 (эти с импортом) с помощью мокко? - PullRequest
0 голосов
/ 14 февраля 2020

Я впервые тестирую JS интерфейс и я выбрал для этого mocha.
У меня есть класс, скажем, Market, который использует другие классы, которые я создал.
Я использую выражение import ... from ... и export default Market в конце.

поэтому класс Market выглядит так:

import { math, AnotherClass, MyOtherClass } from '../index.js'
class Market {
  constructor () {
    // code here
  }
  methodToTest(input) {
    // some code here ...
    return output
  }
}
export default Market

, а затем мой тест. js

var assert = require('assert')
// import { Market } from '../public/mm/ai/Market.js'
var Market = require('../public/mm/ai/Market')

describe('Market', function() {
    describe('#methodToTest()', function() {
        it('should return 0 input is greater than mean + 4 * sigma', function() {
           var market = new Market()
           assert.equal(market.methodToTest(45), 0)
        })
    })
})

и после запуска теста я получаю ошибку:

import { math, AnotherClass, MyOtherClass } from '../index.js'
^^^^^^

SyntaxError: Cannot use import statement outside a module

и стек ошибок.

И вопрос: Как заставить mocha тестировать мои модули с этим импортом?
Как вы видите, я также пытался использовать импорт непосредственно в тесте. js, и он также не удался. Но я не хочу переписывать весь мой проект для использования require, так как он отлично работает в браузере, как и сейчас.

1 Ответ

0 голосов
/ 18 февраля 2020

Итак, я сам нашел решение.

  1. Babel & mocha - лучшее, без промежуточных файлов

Сначала .mochar c. js файл для настройки mocha для использования babel и chai:

module.exports = {
    require: ['chai', '@babel/register'],
    ui: 'bdd',
    // ui: 'tdd',
    reporter: 'spec',
    growl: false,
};

Я выбрал ui: 'bdd' , потому что я использовал описание в тесте. js: describe('Market class:', function() {

Во-вторых, я добавил babel конфигурацию в упаковке. json:

"babel": {
    "env": {
      "test-console": {
        "presets": ["@babel/preset-env"],
        "plugins": ["@babel/plugin-proposal-class-properties"]
      }
    ,
      "test": {
        "presets": ["@babel/preset-env"],
        "plugins": ["@babel/plugin-proposal-class-properties", "transform-remove-console"]
      }
    }
  },

Две среды для использования с выходом консоли и без него.
Это приводит к пакету . json секция сценариев для выполнения одной из них:

 "scripts": {
    "test": "BABEL_ENV=test mocha || TRUE",
    "test-console-log": "BABEL_ENV=test-console mocha || TRUE"
  },

и теперь я был готов к выполнению теста . js. Выполнен импорт в мои модули.
Вот глава теста. js:

var assert = require('chai').assert
import Market from '../public/mm/ai/Market.js'
...

Я перешел на импорт, когда дело касалось моих собственных модулей.

Webpack, babel & mocha

Все в конфигурации webpack:

var path = require('path');
const TerserPlugin = require('terser-webpack-plugin')

module.exports = {
  mode: 'none',
  entry: './test/test.js',
  output: {
      path: path.resolve(__dirname, 'test/'),
      filename: 'exec_test.js'
  },
  module: {
    rules: [
        {
            test: /\.js$/,
            exclude: /node_modules/,
            use: {
                loader: 'babel-loader',
                options: {
                    presets: ['@babel/preset-env'],
                    plugins: ['@babel/plugin-proposal-class-properties']
                }
            }
        }
    ]
  },
  optimization: {
      minimize: true,
      minimizer: [new TerserPlugin({
          terserOptions: {
              compress: 
              {
                  drop_console: true
                }
            }
        })]
    }
};

, а затем вы можете собрать и запустить его:

"scripts": {
   "build-tests-webpack": "webpack --config webpack.config.test.js",
   "exec test": "mocha --ui bdd test/exec_test.js"
}

в упаковке. json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...