Reactクラスコンポーネントをテストしたい。
クラスに現在の状態と小道具に基づいて何かを計算するメソッドがあるとしましょう。
import Component from './Component'
const wrapper = enzyme.shallow(<Component {...props} />);
it('does something', () => {
expect(wrapper.instance().someInstanceMethod(input)).toBe(true);
});
TypeScriptはProperty 'someInstanceMethod' is not defined on type Component<any, any>
。クラスがどのように見えるか、どのメソッドを持っているかをTypscriptに伝えるにはどうすればよいですか?
これの良い例はありますか?
shallow
の呼び出しでコンポーネントタイプを設定できます。これはbiolerplateの少しですが、物事をタイプセーフにします。良いことは、ラッパーはタイプセーフであり、取り出すインスタンスだけではないということです。
import Component from './Component'
// Wrapper will know the type of the component.
const wrapper = enzyme.shallow<Component>(<Component {...props} />);
it('does something', () => {
expect(wrapper.instance().someInstanceMethod(input)).toBe(true);
// You can also get the state from the wrapper.
expect(wrapper.state().someComponentState).toBeTruthy();
});
1つの可能な解決策(marzelinからのコメントのおかげ)は、instance()
メソッドの型を明示的に宣言することです。これを行うよりエレガントな方法があるかもしれません。
import Component from './Component'
const wrapper = enzyme.shallow(<Component {...props} />);
const instance = wrapper.instance() as Component; // explicitly declare type
it('does something', () => {
expect(instance.someInstanceMethod(input)).toBe(true); // no TS error
});
@marzelinと@Chrisに感謝します!その他の可能な解決策
import Component from './Component'
const wrapper = enzyme.shallow(<Component {...props} />);
const instance = wrapper.instance() as any; // explicitly declare type
it('does something', () => {
expect(instance.someInstanceMethod(input)).toBe(true); // no TS error
});
これは、someInstanceMethod
がパラメーターとしてイベントを受け取り、component
として型を明示的に宣言する場合に便利です。イベントオブジェクト全体を渡す必要があります。