私はReactコードのJestテストを書いており、PropTypeチェックを利用/テストしたいと思っています。私はJavascriptの世界にはまったく慣れていません。npmを使ってreact-0.11.2
とシンプルな
var React = require('react/addons');
私のテストでは。私のテストは、jest/reactチュートリアルの例と非常によく似ていますが、次のようなコードがあります。
var eventCell = TestUtils.renderIntoDocument(
<EventCell
slot={slot}
weekId={weekId}
day={day}
eventTypes={eventTypes}
/>
);
var time = TestUtils.findRenderedDOMComponentWithClass(eventCell, 'time');
expect(time.getDOMNode().textContent).toEqual('19:00 ');
ただし、EventCell
コンポーネントのPropTypeチェックはトリガーされていないようです。チェックは開発モードでのみ実行されることを理解していますが、npmでreact
を取得すると開発バージョンが得られると考えました。 watchifyでコンポーネントをビルドすると、ブラウザーでチェックがトリガーされます。
私は何が欠けていますか?
根本的な問題は console.log
?のテスト方法 です。
簡単な答えは、テスト中にconsole.{method}
を置き換える必要があるということです。一般的なアプローチは、 spies を使用することです。この特定のケースでは、出力を防ぐために stubs を使用できます。
Sinon.js を使用した実装例を次に示します(Sinon.jsはスタンドアロンのスパイ、スタブ、およびモックを提供します)。
import {
expect
} from 'chai';
import DateName from './../../src/app/components/DateName';
import createComponent from './create-component';
import sinon from 'sinon';
describe('DateName', () => {
it('throws an error if date input does not represent 12:00:00 AM UTC', () => {
let stub;
stub = sinon.stub(console, 'error');
createComponent(DateName, {date: 1470009600000});
expect(stub.calledOnce).to.equal(true);
expect(stub.calledWithExactly('Warning: Failed propType: Date unix timestamp must represent 00:00:00 (HH:mm:ss) time.')).to.equal(true);
console.error.restore();
});
});
この例では、DataName
コンポーネントは、正確な日付(12:00:00 AM)を表さないタイムスタンプ値で初期化されたときにエラーをスローします。
console.error
メソッドをスタブしています(これは、Facebook warning
モジュールがエラーを生成するために内部的に使用しているものです)。スタブが1回呼び出され、エラーを表すパラメーターが1つだけであることを確認します。
モッキングconsole.error
は単体テストでの使用には適していません! @AndrewWillemsは、このアプローチの問題を説明する上記のコメントの another SO question にリンクされています。
facebook/prop-typesのこの問題 propTypeエラーをログに記録する代わりにそのライブラリがスローする機能についての説明を確認してください(執筆時点ではサポートされていません)。
その間に check-prop-types の動作を提供するヘルパーライブラリを公開しました。次のように使用できます。
import PropTypes from 'prop-types';
import checkPropTypes from 'check-prop-types';
const HelloComponent = ({ name }) => (
<h1>Hi, {name}</h1>
);
HelloComponent.propTypes = {
name: PropTypes.string.isRequired,
};
let result = checkPropTypes(HelloComponent.propTypes, { name: 'Julia' }, 'prop', HelloComponent.name);
assert(`result` === null);
result = checkPropTypes(HelloComponent.propTypes, { name: 123 }, 'prop', HelloComponent.name);
assert(`result` === 'Failed prop type: Invalid prop `name` of type `number` supplied to `HelloComponent`, expected `string`.');
新しいパッケージ jest-prop-type-error は簡単に追加でき、PropType
エラーで失敗します。
経由でインストール:
yarn add -D jest-prop-type-error
次に、package.json
のsetupFiles
セクションのjest
セクションに以下を追加します。
"setupFiles": [
"jest-prop-type-error"
]
ReactJSはコンソールに警告のみを送信しますが、実際にはエラーをスローしないため、次の方法でprop値をテストします。
var myTestElement = TestUtils.renderIntoDocument(
<MyTestElement height={100} /> );
it("check MyTestElement props", function() {
expect( typeof myTestElement.props.height ).toEqual ( 'number' );
});