2016-08-20 29 views
-1

我是新使用AVA的JS單元測試,我馬上打石頭:AVA單元測試:使用一飲而盡,AVA以測試全局函數

我的情況是,我想運行一飲而盡任務運行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"]) 
); 

的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

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'); 
}); 

謝謝!

回答

0

我認爲你的意思是UMD,而不是AMD。 AMD不會工作。

我建議你按照我們的recipe on browser testing with jsdom

你可以做頂部的下列內容:

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

然後你就可以訪問你的庫中的window全球:

window.yourLib(); 

隨着yourLib是你連接到window的方法你圖書館。

+0

非常感謝Sindre! 我能夠要求文件以這種方式測試,但實際上我認爲我沒有很好地描述我的情況: 要測試的文件沒有將方法附加到Window對象,文件已滿需要測試的簡單函數。 像這樣的smth是文件的內容:function Name(par){...}。所以,如果我需要文件測試,並且我需要測試它的函數「名稱」,則返回參考錯誤「名稱未定義」。 我想我需要在文件上使用它作爲模塊的墊片,但我怎麼能做到這樣的功能oraccess? 非常感謝! –

+0

P.S:我解決了將代碼添加到js文件以測試並附加到窗口屬性「window.tests」我需要測試的函數的問題。如果這是最直接的解決方案,那麼有一個gulp插件可以將文件的所有「孤立」功能附加到窗口對象以進行測試:D可以實現類似於 –

相關問題