Asp.net mvc 如何测试ModelBindingContext.ValueProvider中的所有值被自定义模型绑定器使用
我正在为自定义模型绑定器(MVC 3)编写一个单元测试,并希望确认通过ValueProvider传入的所有值都被绑定器使用(意味着绑定器读取它们并将它们绑定到模型对象)。(我还需要一个测试用例来确认不使用具有额外值的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
<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)