web-dev-qa-db-ja.com

JestでCucumber.jsを使用する

私はユニットテストにJestを使用しており、Gherkinで記述された仕様を実行するためにCucumber.jsを統合しているところです。

私はそれをすべてセットアップし、それは機能していますが、1つの問題に直面しています:Jestのexpectをどのように使用できますか? chaiを使用することもできますが、ユニットテストとステップ定義の間でexpect構文を同じにしたい(ステップ定義にto.equalを使用したくない)と私のユニットテストでtoEqual)。

どうやってやるの?少し掘り下げた後、Jestはexpect npmパッケージに依存しているようです。 package.jsonで明示的にそのパッケージに依存することもできますが、既存のJest依存関係を使用するほうがはるかに便利です。それは不可能かもしれませんが、それが可能であることを願っています。

もう1つのオプションは、JestテストランナーでGherkin仕様を実行することです。私もそのオプションを受け入れます。現時点では、Jestテストランナーとは別にcucumber.jsを呼び出して実行しています。

11

ぼくの 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();
  }
});

お役に立てば幸いです。

6
Mike S.

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 私が投稿した設定の例を示します。

4
wordyallen