0

我正在使用 BDD/TDD 技术开发一个项目,并且我正在尽最大努力坚持到底。我刚刚遇到的一个问题是对 DefaultModelBinder 进行单元测试。我正在使用 mspec 编写我的测试。

我有一个这样的类,我想绑定到:

public class EmailMessageInput : IMessageInput
    {
        public object Recipient
        {
            get; set;
        }

        public string Body
        {
            get; set;
        }

    }

这是我构建规范上下文的方式。我正在构建一个假表单集合并将其填充到 bindingContext 对象中。

public abstract class given_a_controller_with_valid_email_input : 
            given_a_controller_context
        {
            Establish additional_context = () =>
                               {
                                   var form = new FormCollection
                                                  {
                                                      new NameValueCollection
                                                          {
                                                              { "EmailMessageInput.Recipient", "test@test.com"},
                                                              { "EmailMessageInput.Body", "Test body." }
                                                          }
                                                  };

                                   _bindingContext = new ModelBindingContext
                                                         {
                                                             ModelName = "EmailMessageInput",
                                                             ValueProvider = form
                                                         };

                                   _modelBinder = new DefaultModelBinder();
                               };

            protected static ModelBindingContext _bindingContext;
            protected static DefaultModelBinder _modelBinder;
        }

        public abstract class given_a_controller_context
        {
            protected static MessageController _controller;

            Establish context =
                () =>
                    {
                        _controller = new MessageController();
                    };
        }

最后,当我从我的一个规范中执行 .BindModel() 时,我的规范引发了一个空引用异常:

Because of = () => 
                 {
                     _model = _modelBinder.BindModel(null, _bindingContext);
                 };

任何线索可能是什么?

如果需要,请随时向我询问更多信息。我可能认为某些事情是理所当然的。

4

1 回答 1

0

恐怕我得从一个问题开始:你为什么要测试默认的模型绑定器?该类DefaultModelBinder是框架的一部分,因此您不负责测试。你应该假设它是一个工作的黑匣子。

无论如何,看看你的代码,我认为你想要完成的是得到一个绑定模型来进一步测试;我在正确的轨道上吗?如果是这样,我建议您查看James Broome 的 MSpec extensions for MVC

源代码带有几个示例;但它允许您,例如,调用控制器上的操作方法,并通过简单地执行(键入!)ViewModel(您从控制器操作传递给视图的视图模型)

It should_display_the_person_name = () => result.Model<Person>().Name.ShouldNotBeNull();

希望这可以帮助

于 2010-05-16T11:15:49.360 回答