Javascript AVA单元测试:使用gulp AVA测试全局功能

Javascript AVA单元测试:使用gulp AVA测试全局功能,javascript,unit-testing,requirejs,jasmine,ava,Javascript,Unit Testing,Requirejs,Jasmine,Ava,我刚开始使用AVA进行JS单元测试,我立即遇到了一个难题: 我的情况是,我想运行一个gulp任务来运行AVA测试并查看测试文件,在我编写的测试文件中,我需要包含包含要测试的代码的js文件 问题是,包含要测试代码的文件是一个包含所有全局函数的旧js文件,因此需要以某种方式填充到AMD模块中,但我如何在不更改原始文件的情况下做到这一点 gulpfile.js var gulp = require("gulp"); var ava = require("gulp-ava"); var srcUnit

我刚开始使用AVA进行JS单元测试,我立即遇到了一个难题:

我的情况是,我想运行一个gulp任务来运行AVA测试并查看测试文件,在我编写的测试文件中,我需要包含包含要测试的代码的js文件

问题是,包含要测试代码的文件是一个包含所有全局函数的旧js文件,因此需要以某种方式填充到AMD模块中,但我如何在不更改原始文件的情况下做到这一点

gulpfile.js

var gulp = require("gulp");
var ava = require("gulp-ava");

var srcUnitTestFiles = ["**/*.tests.js", "!node_modules/*.js"];

gulp.task("unit-tests-exec", () =>
    gulp.src(srcUnitTestFiles)
        // gulp-ava needs filepaths so you can't have any plugins before it
        .pipe(ava({ verbose: true }))
);

gulp.task("unit-tests-watch", () =>
    gulp.watch(srcUnitTestFiles, ["unit-tests-exec"])
);
import test from "ava";

// I need to import the js file to test

test.before(t => {

});

test("foo", t => {
    t.pass();
});

test('bar', async t => {
    const bar = Promise.resolve('bar');

    t.is(await bar, 'bar');
});
package.json

{
  "name": "name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "ava"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "ava": "^0.16.0",
    "gulp": "^3.9.1",
    "gulp-ava": "^0.14.0",
    "jsdom": "^9.4.2"
  },
  "ava": {
    "require": [
      "./test/helpers/setup-browser-env.js"
    ]
  }
}
firstTest.tests.js

var gulp = require("gulp");
var ava = require("gulp-ava");

var srcUnitTestFiles = ["**/*.tests.js", "!node_modules/*.js"];

gulp.task("unit-tests-exec", () =>
    gulp.src(srcUnitTestFiles)
        // gulp-ava needs filepaths so you can't have any plugins before it
        .pipe(ava({ verbose: true }))
);

gulp.task("unit-tests-watch", () =>
    gulp.watch(srcUnitTestFiles, ["unit-tests-exec"])
);
import test from "ava";

// I need to import the js file to test

test.before(t => {

});

test("foo", t => {
    t.pass();
});

test('bar', async t => {
    const bar = Promise.resolve('bar');

    t.is(await bar, 'bar');
});

谢谢

我想你指的是UMD,不是AMD。AMD不起作用

我建议你按照我们的建议去做

您可以在顶部执行以下操作:

global.document = require('jsdom').jsdom('<body></body>');
global.window = document.defaultView;
require('./your-lib');

使用
yourLib
作为您附加到库中
window
的方法。

非常感谢Sindre!我可以要求文件以这种方式进行测试,但实际上我认为我没有很好地描述我的情况:要测试的文件没有将方法附加到窗口对象,是一个充满了需要测试的普通函数的文件。像这样的smth是文件的内容:函数名(par){…}。因此,如果我需要测试文件,并调用需要测试的函数“Name”,它将返回引用错误“Name未定义”。我想我需要在文件上添加一个垫片,以便将其用作模块,但我如何才能做到这一点或访问该功能?谢谢!附言:我解决了将代码添加到js文件中以测试并附加到窗口属性“window.tests”中我需要测试的函数的问题。如果这是最简单的解决方案,最好有一个gulp插件,将文件的所有“孤立”函数附加到窗口对象以进行测试:D我可以实现类似的东西