Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何测试ModelBindingContext.ValueProvider中的所有值被自定义模型绑定器使用_Asp.net Mvc_Asp.net Mvc 3_Unit Testing_Model_Model Binding - Fatal编程技术网

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

Asp.net mvc 如何测试ModelBindingContext.ValueProvider中的所有值被自定义模型绑定器使用,asp.net-mvc,asp.net-mvc-3,unit-testing,model,model-binding,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 t

我正在为自定义模型绑定器(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
有两种方法:

A) 创建一个IValueProvider的模拟,该模拟具有测试是否使用所有的逻辑

B) 接受多表断言,但将它们提取到一个方法中,以保持unittest简短易读

我之所以选择B)是因为简单——除非我期望类似的测试涉及IValueProvider。我会调用断言方法,类似于
assertthattallvaluesareconsumed(testBindingContext)

问候,,
莫顿

我不介意多重断言,但我需要断言什么呢?我不认为这里有什么神奇的金块。您需要知道活页夹应该如何使用,并坚持这些期望。另一种选择是mock对象,它可以判断是否所有的值都已被读取。这正是问题所在。ModelValueProvider在使用值时是否遵循任何假设,或者我是否需要通过mock.Hmmm。。。你到底想测试什么?在您的问题中,您声明要测试活页夹。不应该在单元测试中探讨另一个对象(您的提供者)如何为绑定器提供数据。这将使它成为一个集成测试。您应该假设提供者做了它应该做的事情。
Assert.IsTrue(testBindingContext.ValueProvider.AllValuesConsumed)