我正在尝试为自定义模型绑定者写一些测试,而我的上帝是难以存根的测试。我在网上找到的东西都不直接涉及ASP.Net Mvc 3,或者往往有非常不完整的例子。如何在ASP.Net中测试ModelBinder Mvc 3
具体来说,我打的最大的墙是bindingContext.ModelType - 设置它明确地抛出一个(运行时)错误,该setter已经过时,它是从Model参数推断的,但是Model参数对我来说是and应该是空的!
我正在尝试为自定义模型绑定者写一些测试,而我的上帝是难以存根的测试。我在网上找到的东西都不直接涉及ASP.Net Mvc 3,或者往往有非常不完整的例子。如何在ASP.Net中测试ModelBinder Mvc 3
具体来说,我打的最大的墙是bindingContext.ModelType - 设置它明确地抛出一个(运行时)错误,该setter已经过时,它是从Model参数推断的,但是Model参数对我来说是and应该是空的!
Hanselman的解释了这个在这里很详细:
http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx
更新:上面的示例是过时的。阅读这篇文章的评论!
Thomas & George,您必须在ModelBindingContext上设置值提供程序。以下是我的HomeController Index操作中的一个代码示例,它创建一个类型并使用默认的模型绑定器来保存对象。这只是一个简化版本,在我的生产代码中,我实际上将一个参数放入控制器操作中,然后在动态时动态创建类型,当您想要将多个类型发送到单个控制器操作。注意ValueProvider和ControllerContext是控制器的属性。
HomeModel test = new HomeModel();
ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => test, test.GetType());
ModelBindingContext modelBindingContext = new ModelBindingContext { ModelMetadata = metadata, ValueProvider = ValueProvider};
DefaultModelBinder defaultModelBinder = new DefaultModelBinder();
defaultModelBinder.BindModel(ControllerContext, modelBindingContext);
嗯,但是你正在从Controller中选择ValueProvider - 这在单元测试中是不可用的。但我似乎记得尝试创建一个ValueProvider并失败,因为它需要很多复杂的参数。我试图通过ASP MVC源单元测试,似乎他们依靠的事实,ASP MVC公开一些类直接到单元测试使用InternalsVisibleTo –
你应该看看这篇文章来创建你自己的ValueProviderFactories.http://blog.approache.com/2011/03/unit-test-actions-with。 HTML – aBetterGamer
我已阅读过这篇文章,它已经被严重废弃 –
其实我认为它已经过时了。也许一些最初的东西,但单元测试代码仍然有效,对吧? – ThomasArdal
ValueProviderDictionary已过时,并且从那里变得更糟。东西不再以同样的方式束缚,像ModelType这样的东西根本无法直接设置。我无法得到我的场景(从一个模拟数据库加载模型或创建一个新模型)在这种模式下工作。 –