2017-11-28 11 views
2

React Nativeプロジェクトの単体テストを書くときに、異なるプラットフォームに基づいて異なるスナップショットをテストできるようにしたいと考えています。React Native:Jest Mocking Platform

私はまずjest.mockを模擬してPlatformにしようとしましたが、非同期であるようです。このアプローチは2つの別々のファイルがある場合には機能しますが、可能であればすべてを1つのファイルに保存したいと考えています。

Iは理由ドキュメントからこのスニペットのjest.doMockを試みた:

をバベル、冗談を使用する場合、自動的にコード・ブロックの先頭に掲揚するモックの呼び出し。この動作を明示的に回避するには、このメソッドを使用します。 https://facebook.github.io/jest/docs/en/jest-object.html#jestdomockmodulename-factory-options

しかし、私はまだ望ましくない結果を見ています。アンドロイドテストでconsole.logが表示されたら、Platform.OSは最初に設定したものです。doMockです。私はそれが http://facebook.github.io/jest/docs/en/setup-teardown.html#scoping

describe('ios test',() => { 
    it('renders ui correctly',() => { 
    jest.doMock('Platform',() => { 
     const Platform = require.requireActual('Platform'); 
     Platform.OS = 'ios'; 
     return Platform; 
    }); 
    const wrapper = shallow(<SomeComponent />); 
    const tree = renderer.create(wrapper).toJSON(); 
    expect(tree).toMatchSnapshot(); 
    }); 
}); 

describe('android test',() => { 
    it('renders ui correctly',() => { 
    jest.doMock('Platform',() => { 
     const Platform = require.requireActual('Platform'); 
     Platform.OS = 'android'; 
     return Platform; 
    }); 
    const wrapper = shallow(<SomeComponent />); 
    const tree = renderer.create(wrapper).toJSON(); 
    expect(tree).toMatchSnapshot(); 
    }); 
}); 

私は同じファイルにテストのための模擬プラットフォームを変更する方法上の任意のアイデアをスコープに役立つかもしれないと思ったbecasue

は、私はまた、 describebeforeEachでモックをラップしようとしましたか?

答えて

1

ありanother questionでこの問題を解決する方法についての提案の多くがありますが、それらのどれもあなたが持っている同じ要件(異なるOS用のテスト同じスイートファイル内とで与えられ、いずれかの私のために働いていません試験実行)。

私は最終的にテストに期待通り嘲笑することができることをやや不格好な些細なヘルパー関数とその周りに働いた - 何かのように:

export function getOS() { 
    return Platform.OS; 
} 

はそれを使用しての代わりに、あなたのコード内でPlatform.OS、と単純にモックそれはあなたのテストで、例えば

it('does something on Android',() => { 
    helpers.getOS = jest.fn().mockImplementationOnce(() => 'android'); 
    // ... 
} 

これはトリックでした。アイディアの信用度はthis guyです。