0

そのため、私のチームが SpecFlow を使用してテストしている MVC アプリを使用しています。ここ[RequiredIf(prop, val)]で説明されている実装を使用します。

ただし、「わずかな」問題が見つかりました。検証は Web ページでは問題なく機能しますが、単体テストでは壊れてしまいます。調査の結果、属性の IsValid() メソッドが単体テストで直接呼び出されていることがわかりました...おそらく、属性がバリデーターにバインドされていないためです。

そのブログでは、セットアップ手順に従って RequiredIf 属性をバリデーターに登録しました。ただし、特定の単体テストの目的のために、テスト セットアップで検証をバインドする場所を見つける必要があります。

多かれ少なかれ論理的なオプションをいくつか試しました。

[Binding]
public class TestSteps
{
     // Every test has to call this helper to load up the controller...
     private void GoToHome()
     {
         // SNIP: Unimportant
         DataAnnotationsViewModelValidatorProvider.RegisterAdapter(..., ...);
     }
}

...テスト スイート ファイルと同様に...

// See attribute for why I figured this may be a logical choice.
[BeforeScenario]
public void Setup()
{
    DataAnnotationsViewModelValidatorProvider.RegisterAdapter(..., ...);
}

...しかし、何らかの理由で、どちらの場所もRequiredIf()その にバインドしませんRequiredIfValidator()

質問: ユニット テストの場合、属性 -> バリデーター バインディングをどこに配置すれば、ユニット テストで修飾されたプロパティが正しく検証されるようになりRequiredIf()ますか?

4

1 に答える 1

0

私は MVC 検証に精通していないので、これが機能する場合と機能しない場合があることを認めなければなりません。

ただし、NUnitを単独で使用している場合は、次のようなことをしたいと思うかもしれません

[FixtureSetup]
public void ....()
{
    DataAnnotationsViewModelValidatorProvider.RegisterAdapter(..., ...);
}

そして現時点では、実際にはバインディングを介して検証を追加していますが、これはリフレクション ホップ全体です。

ただし、自動生成された xxxxx.feature.cs ファイルを見ると、クラスが実際に次のように定義されていることがわかります。

[System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.8.1.0")]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[NUnit.Framework.TestFixtureAttribute()]
[NUnit.Framework.DescriptionAttribute("xxxxx")]
public partial class xxxxxFeature
{

明らかにこれを編集することはできませんが、部分クラスで好きなものを実装する別のファイルを作成できます。

xxxxx.partial.cs 内

public partial class xxxxxFeature
{
     [FeatureSetup]
     ....

他に何もない場合は、さらにいくつかの場所を試してみてください。幸運を。

于 2013-01-16T20:47:37.683 に答える