React/Flux コードを書いて、Jest を使ってテストしています。私のテストが完了するのにすでに長い時間がかかっていることを除いて、これまでのところそれは素晴らしいことです.
犯人は、各テストの間にモックをリセットしているようです。
私の一般的なセットアップは次のようになります。
jest.dontMock('react');
jest.dontMock('../Widget.jsx');
describe('Widget', function() {
var React, TestUtils, Widget, WidgetStore;
beforeEach(function() {
React = require('react/addons');
TestUtils = React.addons.TestUtils;
WidgetStore = require('../WidgetStore');
Widget = require('../Widget');
});
it('should fetch initial state from the store', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
it('should refresh its data when clicked', function() {
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget = TestUtils.renderIntoDocutment(
<Widget />
);
WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});
TestUtils.Simulate.click(widget);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});
私の例では、2 つのテストの間にストアをリロードしないと、 への呼び出し回数に対して間違った結果が得られgetDoobles
ます。これは、同じオブジェクトであるため意味があります。
しかし、モックのリロードには少し時間がかかり、多くのテストを行うと遅くなります。
オブジェクトのクローンを作成するか、リセット関数を呼び出したいと思います。個々の関数のリセット関数 ( mockClear()
) はありますが、オブジェクト全体のグローバル リセットはないようです。また、クローンは React コンポーネントがアクセスしているオブジェクトと同じオブジェクトではないため、オブジェクトのクローンを作成できません。そのため、どの呼び出しも登録されません。
これは他の問題を引き起こします。依存関係チェーンのすべてをリロードする必要があるようです。再要求するだけの場合、アクセスできるオブジェクトは、アクセスできるWidgetStore
オブジェクトと同じではないようですWidget
。
リロードWidgetStore
しただけで、React の 2 つのコピーがロードさWidget
れていることが原因と思われるエラーが頻繁に発生します。そのため、毎回 React をリロードする必要があります。
それで、これを行うより良い方法はありますか?