SpecFlowを使い始めたばかりで、このツールが本当に気に入っています。ただし、シナリオアウトラインへのデータ入力の例に関連するいくつかの問題に直面しています。
私が直面していることは正常なのか、それともトリックがあるのか疑問に思うだけです。
C#Visual Studio 2013を使用し、アンダースコアスタイルのステップ定義を使用してMVCアプリを記述しています。正規表現スタイルも試しましたが、それでも同様の問題が発生します。
したがって、問題は、ユーザー名、パスワードなどをパラメーターとして提供し、サンプルにサンプルデータを含めることです。次のことが発生するようです。-
最初にシナリオを生成するときにパラメーターの周りに ""を配置する必要があります。そうしないと、パラメーターとしてまったく選択されません。ただし、例からデータを渡すと、渡されたデータの最後に「/」が表示されます。シナリオに戻ると、パラメーター周辺の「」を削除します。これは少しイライラしますが、それがそれを処理するための最良の方法であれば、私はそれで生きることができます。誰かがこの点に関して何かアドバイスがあるかどうか疑問に思っています。
次の問題は、データ自体に関連しています。データに@や&などの文字がある場合に表示され、その時点でそのデータを分割し、次のパラメーターにフィードするため、間違ったデータがフィードスルーされます。
以下に私のコードを含めました-誰かがそれを見るための提案やリソースを持っているなら、感謝します。
機能ファイル機能:AccountRegistration組織でMojitoサービスを使用するには、ゲストユーザーとして管理特権を持つアカウントを作成します。
Scenario Outline: Register with valid details
Given I am on the registration page
And I have completed the form with <email> <organisation> <password> and <passwordConfirmation>
When I have clicked on the register button
Then I will be logged in as <username>
And my account will be assigned the role of <role>
Examples:
| email | organisation | password | passwordConfirmation | username | role |
| usernamea | Bytes | password1 | password1 | usernamea | Admin |
| usernameb | Bytes | password2 | password2 | usernameb | Admin |
| usernamec | Bytes | password3 | password3 | usernamec | Admin |
| usernamed | Bytes | password4 | password4 | usernamed | Admin |
| usernamee | Bytes | password5 | password5 | usernamee | Admin |
Scenario Outline: Register with invalid details
Given I am on the registration page
And I have completed the form with <email> <organisation> <password> and <passwordConfirmation>
When I have clicked on the register button
Then I will get an error message
Examples:
| email | organisation | password | passwordConfirmation |
| [email protected] | Bytes | 1LTIuta&Sc | wrongpassword |
| [email protected] | Bytes | 1LTIuta&Sc | 1LTIuta&Sc |
| [email protected] | No Organisation | 1LTIuta&Sc | 1LTIuta&Sc |
生成されたファイルの手順
[Binding]
public class AccountRegistrationSteps
{
[Given]
public void Given_I_am_on_the_registration_page()
{
ScenarioContext.Current.Pending();
}
[Given]
public void Given_I_have_completed_the_form_with_usernamea_Bytes_password_P0_and_password_P1(int p0, int p1)
{
ScenarioContext.Current.Pending();
}
[Given]
public void Given_I_have_completed_the_form_with_Jonesa_mojito_com_Bytes_P0_LTIuta_Sc_and_wrongpassword(int p0)
{
ScenarioContext.Current.Pending();
}
[When]
public void When_I_have_clicked_on_the_register_button()
{
ScenarioContext.Current.Pending();
}
[Then]
public void Then_I_will_be_logged_in_as_usernamea()
{
ScenarioContext.Current.Pending();
}
[Then]
public void Then_my_account_will_be_assigned_the_role_of_Admin()
{
ScenarioContext.Current.Pending();
}
[Then]
public void Then_I_will_get_an_error_message()
{
ScenarioContext.Current.Pending();
}
}
SpecFlow doesデフォルトで文字列パラメーターを処理します。問題は、実行時に値が何であるかを決定する際にSpecFlowに制御を任せることです。
「ステップ定義の生成」を実行したときに、「スタイル」ドロップダウンで「メソッド名-アンダースコア」を選択しました。これにより、SpecFlowまでの入力パラメーターが解釈され、パラメーター値を識別する「貪欲な」正規表現が作成されます。これは、値の一部としてコンマが含まれることを意味します。
「属性内の正規表現」を選択した場合(または、コードを少しリファクタリングし、属性を手動で装飾した場合)、ステップは次のようになります。
[Given(@"I have completed the form with (.*), (.*), (.*), and (.*)")]
public void Given_I_have_completed_the_form_with(string email, string org, string pwd, string conf)
{
//do stuff here
}
これにより、SpecFlowに、末尾のコンマを含まない任意の長さの文字列を受け入れるように指示する、より「控えめな」表現が作成されます。正規表現を単一引用符で囲むと、さらに明確になります。
[Given(@"I have completed the form with '(.*)', '(.*)', '(.*)', and '(.*)'")]
正規表現を自分で管理すると頭痛の種になる可能性がありますが、そうすることでSpecFlowの完全なパワーが明らかになります。
解決済み-@や&などの文字の使用に関する問題ではなかった。実際に、指定されたステートメントでコンマを使用していました。 「and」を使用すると動作します。そのため、ステートメントを次のように記述する必要がありました。-
[〜#〜] solution [〜#〜]
ステートメントを書く
Given I have completed the form with <email> and <organisation> and <password> and <passwordConfirmation>
ステートメントを変更して、文字列にする必要のあるパラメーターを単一引用符で囲みます
Given I have completed the form with '<email>' and '<organisation>' and '<password>' and '<passwordConfirmation>'
生成ステップの定義とその後のステートメントの変更による一重引用符の除外
Given I have completed the form with <email> and <organisation> and <password> and <passwordConfirmation>
少しいじくり回しますが、正しい結果が得られます。将来的には、SpecFlowが更新されて、パラメータがデフォルトとして文字列として処理されるようになります。