无法让 ava transpile 处理相对导入的文件

Cannot get ava transpile to work with relatively-imported files

ES6 导入在此文件中有效,但在导入相关文件(例如我的 Mongoose 用户模型)时生成意外标记 import 错误。

import mongoose from 'mongoose';
^^^^^^

SyntaxError: Unexpected token import

.babelrc

{
  "presets": [
    ["es2015", { "modules": false }]
  ],
  "plugins": [
    "transform-object-rest-spread",
    "transform-async-to-generator",
    "transform-export-extensions"
  ]
}

package.json

 "ava": {
    "require": [
      "babel-register"
    ]
  }

users.test.js

import test from 'ava'
import axios from 'axios'

import User from '../../models/user'
import { USER_REGISTRATION_ROUTES } from '../helpers/_test.properties.js'

test('user registration api works', async function (t) {
  const email = `test${Date.now()}@example.com`

  const userRegistrationData = {
    email,
    first_name: "john",
    last_name: "doe",
    password: "password"
  }

  await axios.post(USER_REGISTRATION_ROUTES, userRegistrationData)
    .then(response => {
      const data = response.data.data
      const user = data.user
      t.deepEqual(response.status, 200, 'Verify: response is successful')
      t.deepEqual(data.registered, true, 'Verify: user is registered')
      t.truthy(Object.keys(user).length > 0,
        'Verify: if registered, user object is returned')
      t.truthy(user.authentication_token,
        'Verify: token is generated on successful registration')
    })
    .catch((err) => {
      t.fail(`Cannot make requst to register user ${err}`)
    })

  User.remove({ email }, function (err) {
    if (err) {
      console.log('error')
    } else {
      console.log('success deleting test user')
    }
  })
})

不要认为 import 在 nodejs 中受支持。你必须使用 require.

const mongoose = require('mongoose');

对我有用的答案是 Serge Seletskyy 提出的以下建议。 es2017 预设是 ES2017 功能(如异步等待)所必需的。

.babelrc

{
  "presets": [
    "es2017",
    "@ava/stage-4",
    "stage-3"
  ],
  "plugins": [
    "transform-runtime"
  ]
}

package.json

"ava": {
  "require": [
    "babel-register"
  ],
  "babel": "inherit"
}

安装模块

yarn add babel-register babel-preset-es2017 @ava/babel-preset-stage-4 babel-plugin-transform-runtime babel-preset-stage-3 --dev

运行 ./node_modules/.bin/ava --verbose 现在应该可以工作了

非测试文件通过 babel-register 加载,这适用于您的 .babelrc。但是,您已禁用模块转译。我在另一条评论中看到您正在使用 Webpack。尝试为 Babel 添加环境配置以恢复模块转译。从我的头顶开始:

{
  "presets": [
    ["es2015", { "modules": false }]
  ],
  "plugins": [
    "transform-object-rest-spread",
    "transform-async-to-generator",
    "transform-export-extensions"
  ],
  "env": {
    "test": {
      "presets": [
        ["es2015", { "modules": true }]
      ]
    }
  }
}

这应该适用于最新的 AVA 版本。

我的 Ava 版本是 1.0.0-beta.4,下面是对我有用的解决方案:

将以下内容添加到您的 package.json

"ava": {
  "require": [
    "@babel/register"
  ]
}

然后npm install --save-dev @babel/register,运行再次测试