如何用Jest为Rails 7设置JavaScript测试

179 阅读1分钟

Ruby、Rails和JS环境的先决条件

以下是我在本教程中使用的工具。

$> ruby --version  
=> 3.1.2  
$> rails --version  
=> 7.0.3.1  
$> node --version  
=> 18.6.0  
$> yarn --version  
=> 1.22.19  

创建新的Rails应用程序--还没有JavaScript

$> rails new myapp && cd myapp  

现在等一下......好吧!你现在有一个新的默认Rails应用程序。

添加最基本的文件

创建一个控制器,如下所示app/controllers/welcome_controller.rb

# inside app/controllers/welcome_controller.rb  
class WelcomeController < ApplicationController  
end

在config/routes.rb中配置一个默认路由,如下所示

# inside config/routes.rb  
Rails.application.routes.draw do  
  get "welcome/index"  
  root to: "welcome#index"  
end  

在里面添加一个视图app/views/welcome/index.html.erb

<!-- inside app/views/welcome/index.html.erb -->
<h1>Hello !<h1>

添加并使用一个ES6模块

创建一个ES6模块,在下面创建一个新文件app/javascript/magicAdd.js

// inside app/javascript/magicAdd.js
const  magicAdd = (a, b) => {
  return a + b;
}
export default  magicAdd;

并从主包中引用该文件。

// inside app/javascript/packs/application.js

// You can left pre-existing JavaScript, that's ok :)

import magicAdd from './magicAdd.js'

let a = magicAdd(2, 4);

console.log(`From mainjs, magicAdd result is ${a}`)

停止你的本地Web服务器,并运行

$/myapp> bin/rails server

如果没有显示错误,你可以运行本地Web服务器。

$/myapp> bin/rails s

现在打开你的浏览器,检查浏览器的控制台,看是否一切正常。

为JavaScript模块创建一个测试

在里面创建一个新文件test/javascript/magicAdd.spec.js

// inside test/javascript/magicAdd.spec.js
import magicAdd from 'magicAdd.js'

describe('magicAdd', () => {

  test('add two numbers', () => {
    // given
    let result = 0;
    // when
    result = magicAdd(1, 3)
    // then
    expect(result).toEqual(4);
  });
  
});

添加JavaScript的依赖性来运行单元测试

我们现在需要。

  • jest,这就是我们的测试框架。
  • @babel/preset-env 和 ,因为使用的是ES6。babel-jest
  • istanbul-reports 来获得一份漂亮的代码覆盖率报告。

因此,让我们运行

$/myapp> yarn add --dev @babel/preset-env babel-jest jest istanbul-reports 

配置Jest

打开package.json,它应该看起来像这样。

{
  "devDependencies": {
    "@babel/preset-env": "^7.18.10",
    "babel-jest": "^28.1.3",
    "istanbul-reports": "^3.1.5",
    "jest": "^28.1.3"
  }
}

在package.json中添加以下属性,这样Jest就能知道哪些目录和文件需要关注,哪些需要忽略。

{
   // all properties as above remain the same...
   "devDependencies": {
    "@babel/preset-env": "^7.18.10",
    "babel-jest": "^28.1.3",
    "istanbul-reports": "^3.1.5",
    "jest": "^28.1.3"
  },
   // add the following property to package.json
  "jest": {
    "testPathIgnorePatterns": [
      "node_modules/",
      "config/webpack/test.js",
      "vendor/bundle/ruby"
    ],
    "moduleDirectories": [
      "node_modules",
      "app/javascript"
    ],
    "collectCoverage": true,
    "coverageReporters": [
      "text",
      "html"
    ],
    "coverageDirectory": "coveragejs"
  }

用你的Rails应用程序配置babel

在你的Rails项目的根部,在babel.config.js ,添加以下代码。

module.exports = { 
  presets: ["@babel/preset-env"],
};

启动测试

这是个重要时刻。

运行

$/myapp> yarn jest

**yarn run v1.22.19**

**PASS** **test/javascript/****magicAdd.spec.js**

**magicAdd**

**✓**  **add two numbers (2 ms)**

  

**-------------|---------|----------|---------|---------|-------------------**

**File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s**

**-------------|---------|----------|---------|---------|-------------------**

**All files** **|** **100** **|** **100** **|** **100** **|** **100** **|**

**magicAdd.js** **|** **100** **|** **100** **|** **100** **|** **100** **|**

**-------------|---------|----------|---------|---------|-------------------**

**Test Suites:** **1 passed****, 1 total**

**Tests:** **1 passed****, 1 total**

**Snapshots:** **0 total**

**Time:** **0.656 s**

**Ran all test suites.**

**✨  Done in 1.54s.**

并在浏览器中打开 coveragejs/index.html 以获得覆盖率。

摘要

这并不复杂,但和npm项目一样,你必须按照正确的顺序来处理依赖关系和插入libs。从这样一个简单的例子开始了解事情是如何进行的,我们希望这对你有帮助!