测试是 Web 应用开发过程中不可获缺的工作。Nuxt.js 尽量帮助你简化这部分工作。

端对端测试

ava 是一个很强大的 JavaScript 测试框架,结合 jsdom,我们就可以轻松地给 nuxt 应用进行端对端测试。

首先,我们需要添加 avajsdom 作为项目的开发依赖:

  1. npm install --save-dev ava jsdom

然后在 package.json 中添加测试脚本,并配置 ava 如果编译待测试的文件:

package.json

  1. "scripts": {
  2. "test": "ava",
  3. },
  4. "ava": {
  5. "require": [
  6. "babel-register"
  7. ]
  8. },
  9. "babel": {
  10. "presets": [
  11. "es2015"
  12. ]
  13. }

接下来我们可以在 test 目录下编写单元测试的逻辑代码:

  1. mkdir test

假设我们有这样一个页面 pages/index.vue

  1. <template>
  2. <h1 class="red">Hello {{ name }}!</h1>
  3. </template>
  4. <script>
  5. export default {
  6. data () {
  7. return { name: 'world' }
  8. }
  9. }
  10. </script>
  11. <style>
  12. .red {
  13. color: red;
  14. }
  15. </style>

当我们利用 npm run dev 启动开发服务器的时候,用浏览器打开 http://localhost:3000,我们能看到红色的 Hello world 标题。

添加一个单元测试文件 test/index.test.js

  1. import test from 'ava'
  2. import { Nuxt, Builder } from 'nuxt'
  3. import { resolve } from 'path'
  4. // 我们用一个变量保留 nuxt 和 server 实例的引用
  5. // 这样可以在单元测试结束之后关掉它们
  6. let nuxt = null
  7. // 初始化 Nuxt.js 并创建一个监听 localhost:4000 的服务器
  8. test.before('Init Nuxt.js', async t => {
  9. const rootDir = resolve(__dirname, '..')
  10. let config = {}
  11. try { config = require(resolve(rootDir, 'nuxt.config.js')) } catch (e) {}
  12. config.rootDir = rootDir // 项目目录
  13. config.dev = false // 生产构建模式
  14. nuxt = new Nuxt(config)
  15. await new Builder(nuxt).build()
  16. nuxt.listen(4000, 'localhost')
  17. })
  18. // 测试生成的html
  19. test('路由 / 有效且能渲染 HTML', async t => {
  20. let context = {}
  21. const { html } = await nuxt.renderRoute('/', context)
  22. t.true(html.includes('<h1 class="red">Hello world!</h1>'))
  23. })
  24. // 测试元素的有效性
  25. test('路由 / 有效且渲染的HTML有特定的CSS样式', async t => {
  26. const window = await nuxt.renderAndGetWindow('http://localhost:4000/')
  27. const element = window.document.querySelector('.red')
  28. t.not(element, null)
  29. t.is(element.textContent, 'Hello world!')
  30. t.is(element.className, 'red')
  31. t.is(window.getComputedStyle(element).color, 'red')
  32. })
  33. // 关掉服务器和Nuxt实例,停止文件监听。
  34. test.after('Closing server and nuxt.js', t => {
  35. nuxt.close()
  36. })

运行上面的单元测试:

  1. npm test

实际上 jsdom 会有一定的限制性,因为它背后并没有使用任何的浏览器引擎,但是也能涵盖大部分关于 dom元素 的测试了。
如果想使用真实的浏览器引擎来测试你的应用,推荐瞅瞅 Nightwatch.js

ESLint

ESLint 是一个很棒的工具,帮助我们提升代码的规范和质量。

在 Nuxt.js 中集成 ESLint 是非常简单的,首先我们需要安装 ESLint 的一系列依赖包:

  1. npm install --save-dev babel-eslint eslint eslint-config-standard eslint-plugin-html eslint-plugin-promise eslint-plugin-standard eslint-plugin-import eslint-plugin-node

然后, 在项目根目录下创建 .eslintrc.js 文件用于配置 ESLint:

  1. module.exports = {
  2. root: true,
  3. parser: 'babel-eslint',
  4. env: {
  5. browser: true,
  6. node: true
  7. },
  8. extends: 'standard',
  9. // 校验 .vue 文件
  10. plugins: [
  11. 'html'
  12. ],
  13. // 自定义规则
  14. rules: {},
  15. globals: {}
  16. }

最后,我们在 package.json 文件中添加一个 lint 脚本命令:

  1. "scripts": {
  2. "lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
  3. }

通过以上配置,可使用以下命令对项目的代码进行 ESLint 校验:

  1. npm run lint

ESLint 会校验应用所有的 JavaScript 和 Vue 文件,除了在 .gitignore 中忽略了的之外。

有个最佳实践是在 package.json 中增加 "precommit": "npm run lint" ,这样可以实现每次提交代码之前自动进行代码检测校验。