出典:ArcGIS Experience Builder - Guide - Unit Testing
良い単体テストを行うためには、テスト可能なコードを書くことが重要です。シンプルな設計原則を適用することが助けになります
単体テストのファイルは .test.ts(x) または .spec.ts(x) で終わり、tests フォルダに置く必要があります。 単体テストは、行動駆動型開発(BDD)スタイルで記述する必要があります。たとえば、以下のようになります。
describe('calculator', function() {
// Describes a module with nested "describe" functions
describe('add', function() {
// Specify the expected behavior
it('should add 2 numbers', function() {
// Use assertion functions to test the expected behavior
expect(foo).toBeTruthy();
expect(foo).toBe('bar');
})
})
})
一般的には、以下の3種類のコードに対して単位テストを書く必要があります。
Jest
のみを使用することができるかもしれません。ほとんどの場合、単体テストを書きやすくするために、いくつかのコンポーネントをモックする必要があります。Jest
と @testing-library/react
を使用する必要があります。テストフレームワークとしてJestを使用し、テスティングライブラリを使用してReactコンポーネントをレンダリングし、そのレンダリング結果を確認します。jimu-for-test
からエクスポートされた wrapWidget
と wrapWidgetSetting
を使用する必要があります。上記のような種類のコードに対して、jimu-for-test
はテストを簡単に書くためのいくつかのヘルパーユーティリティー関数を提供します。例えば、以下のようなものです。
getInitState()
と getDefaultAppConfig()
を使って、このようにストアを初期化することができます。 getAppStore().dispatch(appActions.updateStoreState(getInitState().merge({
appConfig: getDefaultAppConfig().merge({
widgets: {
w1: {
label: 'W 1'
}
}
})
})))
mockFeatureLayer
を呼び出します。mockFeatureLayer(mockData)
フィーチャ レイヤーをモックアップした後は、単体テストのリクエストがネットワークリクエストを行わないため、テストがより安定して高速になります。
const {queryByText} = render(<Component/>)
const {queryByText} = withStoreRender(<Component/>)
expect(queryByText('the text')).toBeInTheDocument();
// Get the widget render, you can pass in store/theme/locale optionally
const render = widgetRender();
// Wrap the widget to inject some props into widget component
const Widget = wrapWidget(_Widget, {config: {}});
// Then, you can render the widget like a native react component
const {queryByText} = render(<Widget/>)
コンポーネントで使用したモジュールをモックする必要があります。loadArcGISJSAPIModule でモジュールをロードした場合は、以下のようにモックを作成します。
jest.mock('jimu-core', () => {
return {
...jest.requireActual('jimu-core'),
loadArcGISJSAPIModule: jest.fn().mockImplementation(moduleId => {
let module
if(moduleId === 'esri/layers/FeatureLayer'){
module = jest.fn().mockImplementation(() => {
return {
queryFeatureCount: () => Promise.resolve(5)
}
})
}
return Promise.resolve(module)
})
}
})
モジュールをインポートすると、jade.mock()
が使えるようになります。
client
フォルダで npm test
を実行します。
単体テストの例は show-unit-tests サンプルをご覧ください。