4

storeと通信するReact ビューがあります。ビューとストアを別々にテストしましたが、組み合わせてテストすることはできませんでした。

ここに記載されている構造に従いましたが、 TypeErrorを受け取りました。を使ってもJestがストアをコンポーネントとして登録しようとしているようdontMockです。

Using Jest CLI v0.2.0
 PASS  __tests__/unit/spec/stores/ViewStore-spec.js (0.248s)
 FAIL  __tests__/unit/spec/components/View-spec.react.js (0.942s)
undefined
● View › it defaults to zero unread
  - TypeError: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/components/View.react.js: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js: Cannot call method 'register' of undefined
        at /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js:43:31
        at Object.runContentWithLocalBindings (/Users/matnorri/dev/projects/matnorri/web-client/node_modules/jest-cli/src/lib/utils.js:357:17)
        ...

関連するコードと思われるものを以下に含めましたが、必要に応じて全体を提供できます。

Jestテストを見る

jest.dontMock('../../../../src/app/scripts/components/View.react');
jest.dontMock('../../../../src/app/scripts/stores/ViewStore');

describe('View', function() {

  var React;
  var TestUtils;
  var ViewComponent;
  var View;

  beforeEach(function() {
    React = require('react/addons');
    TestUtils = React.addons.TestUtils;
    ViewComponent =
      // Tried both lines with same effect.
      // require('../../../../src/app/scripts/components/View.react.js');
      require('../../../../src/app/scripts/components/View.react');
    View = TestUtils.renderIntoDocument(<ViewComponent />);
  });

  it('defaults to zero unread', function() {
    View._toString = jest.genMockFunction();
    View._onChange();
    expect(View.state.unread).toBe(0);
  });
});

ありがとうございました!

4

1 に答える 1

4

ご質問への回答

私もこの問題に遭遇し、 object-assign をモックしないと問題が解決しました。jest.dontMock('object-assign');spec ファイルに追加します。これで問題は解決します。

// View Jest test
jest.dontMock('../../../../src/app/scripts/components/View.react');
jest.dontMock('../../../../src/app/scripts/stores/ViewStore');

あざけるかあざけるか

「モックするかしないか」についての詳細は、Jest ドキュメント Web サイトを参照してください。

Jest は「require」メソッドのデフォルトの動作を変更し、独自の require メソッドを実装します。このようにして、ファイル内のすべての関数をモックできます。そのため、(ストアのように) 何かを実際に機能させたい場合は、ファイルをモックしないでください。

あなたの場合、ViewStore をモックしていないので、この Store のすべての関数が呼び出されます。オブジェクト割り当て関数をモックしなかったためobject-assign、機能しません。このように、ViewStore は正しい方法で作成されず (返されます)、関数がモックされたため、関数が機能しなかったため、テストはエラーをundefinedスローします。Cannot call method 'register' of undefinedassign

また; Jest Web サイトのドキュメントを読むと、「モックするかしないか」についての詳細な説明が見つかります。


追加情報

「object-assign」およびその他の一般的に使用されるモジュール (lodash/underscore など) をunmockedModulePathPatternsテスト構成に追加することをお勧めします。これに関する詳細: https://facebook.github.io/jest/docs/api.html#config-unmockedmodulepathpatterns-array-string

于 2014-12-11T21:25:32.353 に答える