【问题标题】:How to setup Jest for Unit testing normal with php project?如何使用 php 项目设置 Jest 以进行正常的单元测试?
【发布时间】:2017-08-03 16:44:25
【问题描述】:

我需要为我的 PHP 项目设置前端单元测试。 我决定和 Jest 一起去。

这是我的 package.json。

{
  "name": "staging-deploy",
  "version": "1.0.0",
  "description": "Staging deploy",
  "main": "GulpFile.js",
  "author": "some one",
  "license": "BSD-2-Clause",
  "dependencies": {
    "bower": "^1.8.0",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^3.1.1",
    "gulp-chmod": "^2.0.0",
    "gulp-closure-compiler": "^0.4.0",
    "gulp-concat": "^2.6.1",
    "gulp-cssnano": "^2.1.2",
    "gulp-duration": "0.0.0",
    "gulp-jasmine": "^2.4.2",
    "gulp-less": "^3.3.2",
    "gulp-load-plugins": "^1.4.0",
    "gulp-pixrem": "^1.0.0",
    "gulp-postcss": "^6.3.0",
    "gulp-replace": "^0.5.4",
    "gulp-sourcemaps": "^1.11.0",
    "gulp-update": "0.0.2",
    "gulp-update-modul": "^1.5.5",
    "gulp-watch-less": "^1.0.1",
    "run-sequence": "^2.0.0"
  },
  "devDependencies": {
    "jest": "^20.0.4"
  },
  "scripts": {
    "test": "jest"
  }
}

然后我创建了__tests__ 文件夹并像这样制作了我的第一个测试功能。

// homepage.test.js

require('../modules/homepage.js');

test('adds 1 + 2 to equal 3', function() {
    expect(Homepage.sum.sumNumber(1, 2)).toBe(3);
});

这是我的主页.js

// homepage.js

var Homepage = {};

(function() {
    "use strict";

    Homepage.sum = {
        sumNumber: function(num1, num2) {
            return num1 + num2
        }
    };
})();

然后我跑了npm run test 这是我得到的:

FAIL  __tests__/homepage.test.js
  ● adds 1 + 2 to equal 3

    ReferenceError: Homepage is not defined

      at Object.<anonymous> (__tests__/homepage.test.js:4:12)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
      at process._tickCallback (internal/process/next_tick.js:109:7)

  ✕ adds 1 + 2 to equal 3 (2ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        3.138s, estimated 11s

似乎我的测试文件无法访问我的 Homepage.js 文件中的函数。

我该如何解决这个问题并使其正常工作?

谢谢

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    普通的 js 模块加载器不能这样工作。如果要导出模块的任何内容,则应将其附加到 module.exports 对象或简单地覆盖它。这个对象是唯一将从模块中导出的东西。所以:

    // homepage.js

    "use strict";
    var Homepage = {};
    
    Homepage.sum = {
            sumNumber: function(num1, num2) {
                return num1 + num2
            }
        };
    
    module.exports = Homepage;
    

    注意,您不需要使用 IIFE,因为所有 js 文件都是模块化的并且有自己的范围。

    然后在你的 homepage.test.js 文件中:

    // homepage.test.js

    var Homepage = require('../modules/homepage.js');
    
    test('adds 1 + 2 to equal 3', function() {
        expect(Homepage.sum.sumNumber(1, 2)).toBe(3);
    });
    

    【讨论】:

    • 有没有办法在不使用 Common js 的情况下执行此操作,因为整个应用程序在没有任何 module.exports 的情况下运行,所以不要添加它是个好主意。
    • @varis.dara,您可以使用 browserify 或使用像 requirejs 这样的 AMD 模块加载系统或使用相当新的 ES6 模块模式为浏览器准备通用的 js 模块化编写代码,并且仅在最新的浏览器中支持,因此您应该使用像 babel 这样的转译器将其转换回普通 js,然后对其进行浏览器化。所有这些都可以很容易地在一个 gulp 任务中配置为自动完成。
    猜你喜欢
    • 2012-12-19
    • 2013-09-11
    • 2021-08-08
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多