2

Webアプリケーションのユーザーロールのテストをいくつか作成する必要があります。説明を最小限に抑えるために、テストの1つには、ユーザーに対してメニューエントリが表示されているかどうかを確認することが含まれます。

このテストでは、次のようなUserRolesというテーブルを使用します。

sUserName    bDoesntHaveMenuX
User1        1
User2        0
User3        1

bDoesntHaveMenuXはビットタイプです。

ValidationRuleから派生したクラスがあり、XPath式に基づいて特定のテキストがページに存在するかどうかをチェックし、テキストを探すノードを見つけます。このクラスのパブリックプロパティは次のとおりです。

string XPathExpression
string Text
bool FailIfFound

最後の1つは、テキストが見つかった場合と見つからなかった場合にルールが失敗するかどうかを示します。

テストでは、DSと呼ばれる最初に述べたテーブルのデータソースを追加しました。興味のあるリクエストに対して、検証ルールクラスの新しいインスタンスを次の値で追加しました。

Text=MenuX
XPathExpression=//div[@id='menu']//td
FailIfFound={{DS.UserRoles.bDoesntHaveMenuX}}

残念ながら、これは機能しません。その理由は、データバインディングプロセスがコンテキスト変数DS.UserRoles.bDoesntHaveMenuXの値が「False」または「True」であるためと思われます。値は文字列であるため、バインドするとキャストエラーが発生します。

私が考える限り、私の選択肢は次のとおりです。

  1. FailIfFoundの文字列を受け入れるように検証ルールを変更します。2つの理由から、有効なオプションではありません。それはハックであり、他の場所でも同じルールが使用されています。
  2. 上記の検証ルールを使用する新しい検証ルールを作成し、FailIfFoundを文字列として実装します。上記と同じ理由で、私もこれが好きではありません。それはハックです。
  3. データを検証ルールに渡す前に、テストをコーディングして適切なキャストを実行します。他に方法がない場合にのみテストをコード化することを好むので、これは好きではありません。

それは私に質問をもたらします。別の方法はありますか?

ありがとうございました。

4

1 に答える 1

1

したがって、基本的な問題は、データバインディングが「ビット」データ型をどのように処理するかを制御できず、boolではなく文字列に変換されることです。

私が考えることができる唯一の解決策(残念ながらまだ少しハックですが、FailIfFoundを文字列に変更するほどひどいものではありません)は、WebTestPluginを作成し、PreRequestDataBindingまたはPreRequestイベントで値を文字列からブール値に変換することです。テストにプラグインを追加することを忘れないでください(私が犯した簡単な間違い)。

次に、検証ルールが作成されると、新しいブール値が取得され、正しく機能するはずです。

例えば

  string val = e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"].ToString();
  e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"] = (val == "True");

私は実際にこれを試しませんでした...それがうまくいくことを願っています。


編集:ラウンド2...より良い解決策

  1. FailIfFoundプロパティを文字列(前述のサブクラス内)に変更して、データバインディングで正しく機能できるようにします。
  2. ルールのPropertyGrid(True、False)のプロパティの有効な値のドロップダウンリストを提供するTypeConverterを実装します。これにより、GUIでは、FailIfFoundをブール値として持つルールと同じように見えます。必要に応じて(データバインディングなど)、ボックスに独自の値を入力することもできます。
  3. TypeConverterコードを含む.dllのパスを、テストプロジェクトの[参照]セクションに追加します。

これは私が始めたことであり、プロパティの編集ボックスに「True」または「False」と入力するよりもはるかに満足のいくものです。

于 2011-10-06T21:03:34.413 に答える