如何测试ModelBindingContext.ValueProvider中的所有值都被自定义模型绑定器使用

时间:2012-06-19 23:59:17

标签: asp.net-mvc asp.net-mvc-3 unit-testing model model-binding

我正在编写一个自定义模型绑定器(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)

1 个答案:

答案 0 :(得分:1)

有两种方法:

A)创建IValueProvider的模拟,该模拟具有测试是否全部消耗的逻辑。

B)接受多个断言,但将它们提取到一个方法中,以保持单元测试简短,易读。

我会选择B)因为简单 - 除非我期望涉及IValueProvider的类似测试。我会将断言方法称为AssertThatAllValuesAreConsumed(testBindingContext)

此致 的Morten