代码之家  ›  专栏  ›  技术社区  ›  Byron Sommardahl

测试DefaultModelBinder时发生NullReferenceException

  •  0
  • Byron Sommardahl  · 技术社区  · 14 年前

    我正在开发一个使用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);
                     };
    

    有什么线索吗?

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Sergi Papaseit    14 年前

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

    不管怎样,看看你的代码,我认为你想要完成的是让一个绑定模型进一步测试;我走对了吗?如果是的话,我建议你调查一下 James Broome's MSpec extensions for MVC

    源代码有几个例子;但是它允许您,例如,在控制器上调用一个操作方法并在(键入的!)只需执行

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

    希望这有帮助