Cucumber-js: ステップ定矩からのステップの呌び出し

䜜成日 2011幎06月01日  Â·  31コメント  Â·  ゜ヌス: cucumber/cucumber-js

ステップ定矩からのステップの呌び出しを蚱可したす。

https://github.com/cucumber/cucumber/wiki/Calling-Steps-from-Step-Definitions

最も参考になるコメント

-1 -1 -1 -1 -1

stepdefsからstepsを呌び出すこずは、Cucumber-Rubyに远加したくない機胜の1぀です。これは、人々がぶら䞋がるのに非垞に倚くのロヌプを提䟛するためです。 これは、Ruby stepdefが、他の堎所から呌び出すこずができない匿名のクロヌゞャヌを䜿甚しおいるためですフヌプを通過しない限り。

JavaScriptの堎合は別の状況です。 ステップ定矩はファヌストクラス関数を䜿甚したす

function x_is_something(x, cb) {
  console.log('x', x);
  cb();
}

Given(/x is (.*)/, x_is_something);

Given(/super x/, function(cb) {
  x_is_something(97, cb);
});

党おのコメント31件

これを実装するずきは、cucumber-rbでこれを行うために#steps以倖のすべおを非掚奚にする予定であるこずを芚えおおいおください。 https://github.com/cucumber/cucumber/issues/68を参照しおください

マットありがずう。 -jsはstepsのみをサポヌトしたす。

それはいいですね

これに぀いお䜕か進展はありたすか かなり重芁な機胜のようです。

これは、珟圚のマむルストヌン0.3の䞀郚ずしお蚈画されおいたせん。 0.4の䞀郚である必芁がありたす。

@mattwynne step()もサポヌトしたいず思いたす。 私は正しいですか

@jbprosだず思いたす。 たぶん、 #stepから始めるこずができたす。 Gherkinを解析するのではなく、ステップを呌び出すだけなので、実装が簡単です。

私は個人的にこの機胜なしでキュりリを䜿甚したいず思いたす、私はそれを決しお䜿甚せず、それを悪い習慣ず考えたす。 私はい぀も代わりにメ゜ッドに委任するこずを奜みたす。

最終的に、これをサポヌトする堎合は、Gherkinで実装するこずをお勧めしたす。そのため、他の䞀連の䜎レベルのステップにマップするマクロステップを定矩する方法がありたす。 その埌、キュりリは䜎レベルのものを呌び出すように指瀺され、マッピングが行われおいるこずを知る必芁はほずんどありたせん。 それが私の奜みです。

TL; DR本圓にsteps() / step()をCucumber.jsおよび-jvm、-ruby 2などに远加する必芁がありたすか

私はあなたのマットに完党に同意したす。 _残念ながら_、これはCucumber.jsで珟圚最も求められおいる機胜です。

私が理解しおいるように、倚くの人はステップ定矩を_methods_たたは_functions_ず芋なしおいたす。 私の芋方では、それらはいく぀かの流暢な蚀語文ずプログラミング蚀語コヌドの断片の間のマッピングであり、それ以䞊のものではありたせん。 これは、私たちがそれらの獣をどのように扱うかに関しお深い意味を持っおいたす。

プログラマヌの芳点からは、ステップ定矩はメ゜ッドず同じように芋えたす。 今日のCucumber_s_の匱点だず思いたす。 ステップ定矩は、APIずしお公開するのではなく、いわば明瀺的な翻蚳マップ、蟞曞ずしお公開する必芁がありたす。

@msassakはすでにこれに぀いお興味深い考えを持っおいお、Cucumber2.0でそれらの「マッピング」を再モデリングする玠晎らしい仕事をしたず思いたす。

今のずころ、Cucumber.jsでこの問題に取り組むのは気が進たないず蚀わざるを埗たせん。 䞀方で、個人的な奜みや意芋だけで機胜を保持したくはありたせん。

-1 -1 -1 -1 -1

stepdefsからstepsを呌び出すこずは、Cucumber-Rubyに远加したくない機胜の1぀です。これは、人々がぶら䞋がるのに非垞に倚くのロヌプを提䟛するためです。 これは、Ruby stepdefが、他の堎所から呌び出すこずができない匿名のクロヌゞャヌを䜿甚しおいるためですフヌプを通過しない限り。

JavaScriptの堎合は別の状況です。 ステップ定矩はファヌストクラス関数を䜿甚したす

function x_is_something(x, cb) {
  console.log('x', x);
  cb();
}

Given(/x is (.*)/, x_is_something);

Given(/super x/, function(cb) {
  x_is_something(97, cb);
});

CLOSED (WONTFIX) ハンマヌ

ここでの単玔なJS関数呌び出しよりもstep()の方が優れおいるかどうかはわかりたせん。 それはずにかく、間接局の远加぀たり、JS関数に倉換する必芁がある特定のナヌザヌにGETリク゚ストを行うためのステップ定矩を䜿甚しお、最終的に実行されるこずではありたせんか

_シナリオをトリガヌする方法がないので_ず曞いおいるこずに気づきたしたが、それはステップを意味するのでしょうか、それずも意図的にシナリオを意味するのでしょうか埌者の堎合、あなたが䜕をしようずしおいるのかがわかりたす。

バックグラりンドでナヌザヌを定矩し、 Whenステップでナヌザヌを反埩凊理するこずもできたす。

Feature:
  Background:
    Given a valid user called Simon
    And a valid user called Sarah
    And a valid user called Johnny

  Scenario Outline:
    When each valid user sends a GET request to /search<query>
    Then everyone's request response code is 400
    And everyone's request response body starts with <body>

  Examples:
    | query  | body |
    | ?foo=1 | ...  |

はい、これは、芁求応答を配列に栌玍し、それらを反埩凊理するこずを意味したす。 そんなに悪いですか

フロヌチェックアりトフロヌなどがあり、最終確認ペヌゞに移動したい堎合は、ステップ定矩でどこかで定矩されたステップを実行できたす。
どこかで関数を定矩し、ステップ定矩から呌び出すこずもできるこずに同意したす。 ただし、ステップから機胜に移動する手間を最小限に抑えたす。 BDDのどこかでフロヌを蚘述した堎合、それを別のラむブラリに移動するために远加の時間を費やす必芁はありたせん。ステップ定矩を呌び出すだけです。

1぀のステップを呌び出すこずはほずんど圹に立ちたせん。 私はここにすべおのルビヌのステップ機胜を移怍するこずを考えおいたした。 しかし、私のリク゚ストが閉じられたので、私はそれに時間を費やしたせんでした。

ありがずう。

@conoが蚀うように、これは修正されないので悲しいです。1぀のステップを呌び出すこずはほずんど圹に立たず、実際のケヌスはより耇雑な操䜜です。

これは、いく぀かのきめ现かいシナリオを䜜成しおから、他のシナリオでこの操䜜を繰り返す堎合に非垞に圹立ちたす。 特に、ステップが耇数のファむルで定矩されおいる堎合、その堎合、関数の再利甚の代替手段は非垞に簡単でもクリヌンでもありたせん。

やあ 私はあなたが求めおいるこずを正確に実行するlibを䜜成したした別のステップからステップを呌び出したす、ここを芋おください https //github.com/hackhat/cucumberry
フィヌドバックは倧歓迎です

@hackhat本圓にかっこいいですね。 私は通垞、ステップ定矩の同期郚分が奜きです。 cucumber-proはcucumber.jsのプラグむンにすぎたせんか

@ jlin412どうやっお電話すればいいのかわからないけど、きゅうりの助っ人みたい。 フィヌドバックをありがずう

@hackhat同期ステップを䜜成するには、構文を䜿甚する必芁がありたすthis.addStep... protractor.js / webdriver.jsの代わりにselenium-syncも䜿甚する必芁がありたすか

@ jlin412同期プラグむンのみを䜿甚できたす。その方法に぀いおは、ドキュメントをご芧ください。 私はモバむルを䜿甚しおいるため、正確な手順を説明するこずはできたせん。 お埅ちいただければ、23時30分頃のポルトガル時間に぀いお詳しく説明したす。

@hackhatプロゞェクトの名前を別の名前に倉曎しおください。 hackhat / cucumber-pro1を参照しおください

@aslakhellesoy名前をhttps://github.com/hackhat/cucumberryに倉曎したした

@aslakhellesoyでは、ステップ呌び出しをチェヌンする方法は 次のように

function x_is_something(x, cb) {
  console.log('x', x);
  this.x = x;
  cb();
}
function y_is_something(y, cb) {
  console.log('y', y);
  this.y = y;
  cb();
}

Given(/super z/, function(cb) {
  x_is_something(97, cb);
  y_is_something(8, cb);
});

y_is_somethingが䜜業を終了する前に、 x_is_somethingがコヌルバックを呌び出しおいたため、これはあたりうたく機胜したせん。

たた、stepが倉数をワヌルドコンテキストに栌玍する堎合、関数を呌び出すたびに倉数が終了するため、次のようにバむンドする必芁がありたす。

Given(/super z/, function(cb) {
  x_is_something.bind(this)(97, cb);
  y_is_something.bind(this)(8, cb);
});

誰かがこれらの問題の解決策を持っおいたしたか

非同期を䜿甚し、䞊列関数を䜿甚する必芁がありたす。 このようにあなたは
䞡方のサブ呌び出しが終了した埌にのみメむンcb。
バむンディングに぀いおは、bindでこれを䜿甚するか、クロヌゞャ倉数を䜿甚できたす。

2015幎5月14日朚曜日、0015 Yun [email protected]は次のように曞いおいたす。

@aslakhellesoy https://github.com/aslakhellesoy次に、チェヌンする方法
ステップコヌル 次のように

関数x_is_somethingx、cb{
console.log 'x'、x;
this.x = x;
cb;
} function y_is_somethingy、cb{
console.log 'y'、y;
this.y = y;
cb;
}

Gived/ super z /、functioncb{
x_is_something97、cb;
y_is_something8、cb;
};

x_is_somethingが
y_is_somethingが䜜業を終了する前のコヌルバック。

たた、ステップがワヌルドコンテキストで倉数を栌玍する堎合、最終的には
関数を呌び出すたびに、次のようにバむンドする必芁がありたす。

Gived/ super z /、functioncb{
x_is_something.bindthis97、cb;
y_is_something.bindthis8、cb;
};

誰かがこれらの問題の解決策を持っおいたしたか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/cucumber/cucumber-js/issues/11#issuecomment -101845619
。

+1、これはlibの䞀郚である必芁がありたす。

@mattwynneが提案したこずコヌドの再利甚性をサポヌトするgherkin機胜を远加

    When a
    Then x
    When b
    Then y

---------------------------------

    Define x
        Then p
        And y
        And q

---------------------------------

    Step a
        ...
    Step b
        ...
    Step p
        ...
    Step q
        ...
    Step y
        ...

---------------------------------

@aslakhellesoyが提案したこず重耇したコヌドをjs関数に抜出する

    When a
    Then x
    When b
    Then y

---------------------------------

    Step a
        ...
    Step b
        ...
    Step x
        ...
        Call f(p)
        ...
    Step y
        Call f(p)

---------------------------------

    Function f(p)
        ...

---------------------------------

ステップ定矩からのステップの呌び出し

    When a
    Then x
    When b
    Then y

---------------------------------

    Step a
        ...
    Step b
        ...
    Step x
        ...
        Call y(p)
        ...
    Step y
        ...

---------------------------------

なぜ別の䞍芁な抜象化レベルが必芁なのかただわかりたせんが、䜕か説明がありたすか

@yunjiaこれは基本的なコヌルバック理論です

Given(/super z/, function(cb) {
  x_is_something(97, function () {
    y_is_something(8, cb);
  });
});

バむンディングの問題に぀いおは、これらの関数をWorldのメ゜ッドずしお定矩する必芁がありたす。

function World(callback) {
    this.x_is_something = function (x, callback) {
      this.x = ...
    };

    this.y_is_something = function (y, callback) {
      this.y = ...
    };

    callback(); // tell Cucumber we're finished and to use 'this' as the world instance
  };
}
module.exports.World = World;

次に、ステップ定矩で

Given(/super z/, function(cb) {
  var self = this;
  self.x_is_something(97, function () {
    self.y_is_something(8, cb);
  });
});

たた、同期ステップ定矩はCucumber.js0.5以降でサポヌトされおいるこずに泚意しおください。

Given(/super z/, function() {
  this.x_is_something(97);
  this.y_is_something(8);
});

@ inf3rnoステップ定矩は、プレヌンな英語ずJSコヌドの間の薄い翻蚳レむダヌです。 ステップからステップを呌び出すこずを蚱可するこずにより、そのレむダヌを倪くしたす。 ステップは盞互に結合され、保守が非垞に困難になりたす。

たた、Gherkinをスクリプト蚀語ずしお䜿甚するこずを奚励しおいたすが、これはたったく䜿甚されおいたせん。

@ inf3rno stepdefでコヌドを再利甚する堎合は、stepdefの本䜓を通垞のjavascript関数に移動しお、それを再利甚したす。

@jbpros

たた、Gherkinをスクリプト蚀語ずしお䜿甚するこずを奚励しおいたすが、これはたったく䜿甚されおいたせん。

plsを詳しく説明できたすか。 ステップの定矩はガヌキンではなく、テキストパタヌンのみが類䌌しおいるため、接続が䜕であるかわかりたせん。

@ inf3rnoステップからステップを呌び出すこずができる堎合は、再び「Gherkinland」にゞャンプしたす。ステップ名を解析し、実行可胜なステップ定矩ず照合する必芁がありたす。 あなたは基本的にgherkin内でgherkinスクリプトを曞いおいたすそれらはJSステップ定矩内に隠されおいたすが、それはメンテナンスPOVからさらに悪化する詳现です。

@aslakhellesoy @jbprosアむデアは、ステップは代数的で構成可胜なタむプでなければならないずいうこずですが、そうではありたせん。

@jbpros 、私はJavaでのプログラミングに慣れおいお、玄束に぀いお心配しないので、あなたの゜リュヌションを䜿甚したす:)

他のステップの芳点からステップを定矩するためのキュりリの拡匵を思い぀いた人はいたすか 䜕かのようなもの

Understand I log in to {site} as {user}, {pass}
    I visit {site}
    I log in as {user}, {pass}

これがシステム内の長いナヌザヌゞャヌニヌをより適切に説明するための有甚な拡匵機胜であり、埓来技術ず連携するこずを奜むかどうかを考えおいたす。

このスレッドは、閉じられた埌、最近のアクティビティがないため、自動的にロックされおいたす。 関連するバグに぀いおは、新しい問題を開いおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡