JestでWebコンポーネントプロジェクトのテストを作成しようとしています。私はすでにes2015プリセットでバベルを使用しています。 jsファイルの読み込み中に問題に直面しています。私はdocument
オブジェクトがcurrentScript
オブジェクトを持っているコードに従っています。ただし、テストコンテキストではnull
です。だから私は同じことをあざけることを考えていた。ただし、jest.fn()
は実際には役立ちません。この問題に対処するにはどうすればよいですか?
Jestが失敗しているコードの一部。
var currentScriptElement = document._currentScript || document.currentScript;
var importDoc = currentScriptElement.ownerDocument;
私が書いたテストケース。 component.test.js
import * as Component from './sample-component.js';
describe('component test', function() {
it('check instance', function() {
console.log(Component);
expect(Component).toBeDefined();
});
});
Jestによってスローされるエラーは次のとおりです
Test suite failed to run
TypeError: Cannot read property 'ownerDocument' of null
at src/components/sample-component/sample-component.js:4:39
更新: AndreasKöberleからの提案に従って、いくつかのグローバル変数を追加し、次のようにモックしようとしました。
__DEV__.document.currentScript = document._currentScript = {
ownerDocument: ''
};
__DEV__.window = {
document: __DEV__.document
}
__DEV__.document.registerElement = jest.fn();
import * as Component from './arc-sample-component.js';
describe('component test', function() {
it('check instance', function() {
console.log(Component);
expect(Component).toBeDefined();
});
});
しかし、運はありません
更新:上記のコードを__dev__
なしで試しました。また、ドキュメントをグローバルとして設定します。
JestでsetUpFiles
プロパティを使用してこれを解決しました。これはjsdomの後、そして私にとって完璧な各テストの前に実行されます。
Jest configでsetupFilesを設定します。例:
"setupFiles": ["<rootDir>/browserMock.js"]
// browserMock.js
Object.defineProperty(document, 'currentScript', {
value: document.createElement('script'),
});
理想的な状況は、webcomponents.jsを読み込んでjsdomをポリフィルすることです。
他の人が言ったことに似ていますが、自分でDOMをモックしようとする代わりに、JSDOMを使用してください:
__ mocks __/client.js
import { JSDOM } from "jsdom"
const dom = new JSDOM()
global.document = dom.window.document
global.window = dom.window
次に、jest configで:
"setupFiles": [
"./__mocks__/client.js"
],
Nodejsでglobal
スコープモジュールを使用してこの同じ問題を解決し、ドキュメントのモックでドキュメントを設定します。私の場合はgetElementsByClassName
:
// My simple mock file
export default {
getElementsByClassName: () => {
return [{
className: 'welcome'
}]
}
};
// Your test file
import document from './name.component.mock.js';
global.document = {
getElementsByClassName: document.getElementsByClassName
};
私のように、未定義にドキュメントをモックすることを探している場合(例えば、サーバー側/クライアント側のテスト用)、setupFilesを使用せずにテストスイート内でobject.definePropertyを使用できました
例:
beforeAll(() => {
Object.defineProperty(global, 'document', {});
})
私は自分が取り組んでいるプロジェクトの文書のモック作成に苦労しています。 Reactコンポーネント内でdocument.querySelector()
を呼び出していますが、正しく機能していることを確認する必要があります。最終的にこれは私のために働いたものです:
it('should test something', () => {
const spyFunc = jest.fn();
Object.defineProperty(global.document, 'querySelector', { value: spyFunc });
<run some test>
expect(spyFunc).toHaveBeenCalled()
});
プロパティのテスト値を定義する必要がある場合は、もう少しきめ細かいアプローチがあります。各プロパティは個別に定義する必要があり、プロパティをwriteable
にする必要もあります。
Object.defineProperty(window.document, 'URL', {
writable: true,
value: 'someurl'
});
参照: https://github.com/facebook/jest/issues/89
これは、Jest 21.2.1
およびNode v8.11.1
を使用してうまくいきました。