私はユニットテストにJestを使用しており、Gherkinで記述された仕様を実行するためにCucumber.jsを統合しているところです。
私はそれをすべてセットアップし、それは機能していますが、1つの問題に直面しています:Jestのexpect
をどのように使用できますか? chai
を使用することもできますが、ユニットテストとステップ定義の間でexpect
構文を同じにしたい(ステップ定義にto.equal
を使用したくない)と私のユニットテストでtoEqual
)。
どうやってやるの?少し掘り下げた後、Jestはexpect
npmパッケージに依存しているようです。 package.json
で明示的にそのパッケージに依存することもできますが、既存のJest依存関係を使用するほうがはるかに便利です。それは不可能かもしれませんが、それが可能であることを願っています。
もう1つのオプションは、JestテストランナーでGherkin仕様を実行することです。私もそのオプションを受け入れます。現時点では、Jestテストランナーとは別にcucumber.js
を呼び出して実行しています。
ぼくの react-native
環境:
"cucumber": "^4.1.0",
"jest": "22.4.2",
私のsteps definition
ファイル、私はこのようにそれを必要とします
const { Given, Then, When } = require('cucumber');
const expect = require('expect');
ExpectはJestの一部であるため、独自のオブジェクトとしてインポートできます。その後、アサーションが必要な場所ならどこでも使用できます。注:newMember
は宣言され、他の場所に入力されます。
Given('Sara has provided account details', function() {
for (const prop in newMember) {
expect(newMember[prop]).toBeTruthy();
}
});
お役に立てば幸いです。
expect
は、jestランタイム中にグローバルにスコープされます。したがって、jestを実行している限り、それは使用可能になります。私はこのパッケージを使用しています(babel構成に正しく変換するためにいくつかの構成が必要です): gherkin-jest
Jest docsの DOM-testing example を使用した機能は次のとおりです。
Feature: Using feature files in jest and cucumber
As a developer
I want to write tests in cucumber and jest
So that businesspeople understand tests and I can test React
Scenario: Emoji toggles upon checking and unchecking the checkbox
Given I did not check the checkbox, so the label is "????"
When I check the box and the emoji toggles to be "????"
import {cucumber as c} from 'gherkin-jest'
import React from 'react'
import {mount} from 'enzyme'
import {Checkbox} from '../src/components'
c.defineCreateWorld(() => ({
checkbox:null
}))
c.defineRule('I did not check the checkbox so the label is {string}', (world, off) => {
world.checkbox = mount(<Checkbox labelOff={off} />)
expect(world.checkbox.text()).toBe(off)
})
c.defineRule('I checked the box and the emoji toggles to be {string}', (world, on) =>{
world.checkbox = mount(<Checkbox labelOn={on}/>)
world.checkbox.find('TouchableOpacity').props().onPress()
expect(world.checkbox.text()).toBe(on)
})
これ issue 私が投稿した設定の例を示します。