Create-react-appで新しいReactアプリケーションを作成し、アプリケーションで作成した「MessageBox」という名前のコンポーネントに単体テストを書きたいと思いました。これは私が書いた単体テストです:
import MessageBox from "../MessageBox";
import { shallow } from 'enzyme';
import React from 'react';
test('message box', () => {
const app = {setState: jest.fn()};
const wrapper = shallow(<MessageBox app={app}/>);
wrapper.find('button').at(0).simulate('click');
expect(app.setState).toHaveBeenLastCalledWith({modalIsOpen: false});
});
また、「setupTests.js」という名前の「src」フォルダーの下に次のコンテンツを含むファイルを追加しました。
import * as enzyme from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-16';
enzyme.configure({ adapter: new Adapter() });
私はそれを実行しました:
npmテスト
そして、私はエラーを得ました:
酵素の内部エラー:酵素はアダプタが設定されることを期待していますが、どれも見つかりませんでした。アダプターを構成するには、
Enzyme.configure({ > adapter: new Adapter() })
を呼び出す必要があります
この問題を解決できるものを知っていますか?
テストケースファイルに追加します。
import React from 'react';
import Adapter from 'enzyme-adapter-react-16';
import { shallow, configure } from 'enzyme';
configure({adapter: new Adapter()});
test('message box', ()=> {
...
})
また、setupTests.jsファイルをすべてのテストファイルにインポートしたくない場合は、package.jsonフォルダーに配置できます。
"jest": {
"setupTestFrameworkScriptFile": "./test/setupTests.js" }
更新:
Note: setupTestFrameworkScriptFile is deprecated in favor of setupFilesAfterEnv.
ファイル「setupTests」をテストファイルにインポートする必要があります。
import MessageBox from "../MessageBox";
import { shallow } from 'enzyme';
import React from 'react';
import "../setupTests"
test('message box', ()=> {
...
})
Priyankが言った のように、Create React Appを使用している場合、src/setupTests.js
から構成を取得します。
追加:
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
configure({ adapter: new Adapter() })
次のようにインポートを使用する必要があります。
import Adapter from 'enzyme-adapter-react-16';
この方法:(import * as Adapter from ...)は、「TypeError:Adapter is not constructor。」というメッセージを返します。
import React from 'react';
をファイルの先頭に追加します。
JSX構文<MessageBox app={app}/>
を使用しています。これは transpiles をReact.createComponent(...)
に変換します。これが機能するためには、React
変数をファイルのスコープで定義する必要があります。
多くの回答は、テストファイルにsetupTests.js
をインポートすると言っています。または、各テストファイルで酵素アダプターを構成します。これは差し迫った問題を解決します。
ただし、長期的には、jest.config.js
ファイルをプロジェクトルートに追加する場合。起動時にセットアップファイルを実行するように構成できます。
module.exports = {
setupTestFrameworkScriptFile: "<rootDir>/src/setupTests.ts"
}
これにより、起動するたびにsetupTest.tsを実行するようにJestに指示します。
この方法で、ポリフィルを追加したり、localstorageのようなグローバルモックを追加する必要がある場合は、setupTests
ファイルに追加して、どこでも設定できます。
EnzymeのドキュメントはJestとの統合をカバーしていないため、これら2つを融合するのは混乱しています。
ライブラリの最新バージョンを使用して、この質問のすべての回答で報告された同じエラーに直面しました。エラー:TypeError:アダプターはコンストラクターではありません。
Enzymeを使用してReactJSコンポーネントを適切にテストするために必要なすべてのステップをグループ化しました(Jestを使用しましたが、Mochaでも動作する可能性があります。その場合は、メインのテストパッケージを切り替えるだけです) ):
1)ライブラリ(package.json):
"dependencies": {
"jest": "^24.6.0",
(...)
}
"devDependencies": {
"chai": "^4.2.0",
"enzyme": "^3.7.0",
"enzyme-adapter-react-16": "^1.7.0",
(...)
}
2)テスト設定:すべてのテストで酵素を設定できます。しかし、type_master_flashが賢明に示唆したように、それを行うスクリプトを追加できます。そのためには、同じレベルのセッションスクリプト、依存関係などでpackage.jsonファイルに新しい設定を作成します:
Jestバージョン23.x(またはそれ以前):
"devDependencies": {
(...)
},
"jest": {
"setupTestFrameworkScriptFile": "./tests.setup.js"
},
Jest 24.0バージョンの後:Jestドキュメンテーション によると、「setupTestFrameworkScriptFileは廃止され、setupFilesAfterEnvが優先されます。 」。
"devDependencies": {
(...)
},
"jest": {
"setupFilesAfterEnv": ["./tests.setup.js"]
},
このファイルは好きな場所に置くことができ、好きな名前を付けることができます。適切なファイルの場所をセットアップすることを忘れないでください。現在の例では、プロジェクトのルートにファイルを保存しています。
3)tests.setup.js: Enzyme:TypeError:Adapter is not constructor is not constructor 、ここでの問題は、「import ' 'デフォルトのエクスポートを備えたモジュール」。ファイルを設定する適切な方法は次のとおりです。
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
それだけで、コンポーネントをテストできます。
応援し、これが役立つことを願っています。
このように試してみてください。
import React from 'react';
import App from './containers/App';
import enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
enzyme.configure({ adapter: new Adapter() });
describe('App Screen', () => {
let mountedAppScreen;
let props;
const appScreen = () => {
if (!mountedAppScreen) {
mountedAppScreen = enzyme.mount(
<App {...props} />
);
}
return mountedAppScreen;
}
it("it always renders div", () => {
const divs = appScreen().find("div");
expect(divs.length).toBeGreaterThanOrEqual(1);
});
});
将来これを読むすべての人にとって、setupTestFrameworkScriptFile
は、新しいバージョンでは documentation によってsetupFilesAfterEnv
を支持して廃止されます。次のようにファイルを追加できます。
"setupFiles": [
"<rootDir>/src/setupTests.js"
]