6

私はSpecFlowの世界から始めており、最初の問題に遭遇しました。コードをDRYに保つという観点から、次のことを行いたいと思います。

2つのシナリオがあります。

Given I am on a product page
And myfield equals todays date
Then...

Given I am on a product page
And myfield equals todays date plus 4 days
Then...

次のステップ定義を使用して、And句の両方のバリアントをカバーすることを望んでいました。

[Given(@"myfield equals todays date(?: (plus|minus) (\d+) days)?")]
public void MyfieldEqualsTodaysDate(string direction, int? days)
{
//do stuff
}

ただし、SpecFlowがintを解析しようとすると、例外が発生し続けますか?パラメータ。正規表現を確認しましたが、シナリオは確実に期待どおりに解析されます。メソッドのオーバーロードなど、大雑把なものができることは承知しています。SpecFlowがデフォルトのパラメーター値のアイデアをサポートしているのか、それとも同じ効果を実現する別の方法をサポートしているのか、疑問に思っていました。

どうもありがとう

4

4 に答える 4

8

デフォルト値は(まだ)サポートされていませんが、具体的なケースとして、次のことを提案できます。

SpecFlowは、「ステップ引数変換」の作成をサポートしています。それらを使用して、さまざまなパターンから日時を解析できるメソッドを作成できます。

[StepArgumentTransformation("todays date")]
public DateTime TransformToday()
{
  return DateTime.Today;
}
[StepArgumentTransformation("todays date (plus|minus) (\d+) days")]
public DateTime TransformOtherDay(string direction, int days)
{
  //...
}

その後、ステップでDateTimeパラメータを使用するだけで、残りはSpecFlowによって実行されます...

[Given(@"myfield equals (.*)")]
public void MyfieldEqualsTodaysDate(DateTime date)
{
  //do stuff
}

https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversionsで他の例を見ることができます

于 2011-02-26T20:35:36.853 に答える
2

私の友人は次のテクニックを使用しています

Given I am on a product page And myfield equals {TODAY}

Given I am on a product page And myfield equals {TODAY+4}

次に、ステップdefsで特別なフレーズを解析できます。

[Given(@"myfield equals ("SOME MATCHING REGEX")]
public void MyfieldEqualsTodaysDate(string date) {
//parse TODAY or you could use TOMORROW you get the idea
}

于 2011-02-07T14:55:53.093 に答える
2

あなたのステップはかなり開発者中心の言語で表現されているようです。

代わりに利害関係者の言葉でそれらを表現するとどうなりますか?

Given I am on the product page
And my product is due for delivery today

Given I am on the product page
And my product is due for delivery in 4 days

Given I am on the product page
And my product was due for delivery 3 days ago

これで、正規表現を使用してこれらのさまざまな手順を照合し、下位レベルで重複を削除できます。

[Given(@"my product is due for delivery today")]
public void GivenTheProductIsDueToday() {
    var dueDate = Date.Today;
    DoOtherStuffWith(dueDate);
}

[Given(@"my product is due for delivery in (.*) days")]
public void GivenTheProductIsDueIn(int days) {
    var dueDate = Date.Today.AddDays(days);
    DoOtherStuffWith(dueDate);
}

[Given(@"my product was due for delivery (.*) days ago")]
public void GivenTheProductWasDue(int days) {
    var dueDate = Date.Today.AddDays(-1*days);
    DoOtherStuffWith(dueDate);
}

私はまだSpecFlowを使用していませんが、これが理にかなっていることを願っています。BDDの焦点は、テストや自動化ではなく、ビジネスと利害関係者の間の会話を可能にすることです。DRYの場合、それを妥協することは、長期的には役に立たない可能性があります。

于 2011-02-07T17:09:04.140 に答える
0

私がこれまでに思いついた最高のものは次のとおりです。 これは、元の提案よりもはるかにクリーンですが、それでも手動でパラメーターをチェックする必要があります。メソッドの文字列パラメータに注意してください。IntでもIntでもない?上記で定義されたシナリオで動作します。
[Given(@"myfield equals todays date(?: ([\+-]\d+) days)?")]
public void MyfieldEqualsTodaysDate(string days)
{
int modifer = 0;
if(!String.IsNullOrEmpty(days))
{
modifer = Int32.Parse(days)
}
}

于 2011-02-07T15:50:42.227 に答える