0

カスタム モデル バインダー (MVC 3) の単体テストを書いていて、ValueProvider を介して渡したすべての値がバインダーによって消費されることを確認したい (つまり、バインダーが値を読み取ってモデル オブジェクトにバインドしたことを意味します)。(追加の値を持つ ValueProvider が消費されないことを確認するテスト ケースも必要です)

これが私のテストの(動作する)コードです:

    <Test()> _
    Public Sub Should_Bind_Example_Payment_Method_To_Model()
        'arrange
        Dim testBindingContext As New ModelBindingContext() With {
            .ModelName = "MyModel",
            .ValueProvider = New NameValueCollectionValueProvider(
                New NameValueCollection() From {
                    {"Param1", "val1"},
                    {"Param2", "val2"},
                }, Nothing),
            .ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(Nothing, GetType(MyModelType))
        }

        dim testControllerContext as new ControllerContext()
        Dim modelBinder As New MyCustomModelBinder()

        'act
        Dim generatedModel As MyModelType = modelBinder.BindModel(testControllerContext, testBindingContext)

        'assert
        Assert.AreEqual("val1", generatedModel.Param1)
        Assert.AreEqual("val2", generatedPaymentMethod.Param2)

        Assert.IsTrue(testBindingContext.ModelState.IsValid)
    End Sub

このような行を追加したい (これは明らかに無効なコードです)

Assert.IsTrue(testBindingContext.ValueProvider.AllValuesConsumed)
4

1 に答える 1

1

2つの方法があります:

A)すべてを消費するかどうかをテストするロジックを持つIValueProviderのモックを作成します。

B)マルチブルアサーションを受け入れますが、それらをメソッドに抽出して、単体テストを短く、シンプルで読みやすくします。

IValueProviderを含む同様のテストを期待しない限り、単純さのためにB)を選択しました。アサーションメソッドをのようなものと呼びますAssertThatAllValuesAreConsumed(testBindingContext)

よろしく、モーテン

于 2012-06-20T06:49:21.443 に答える