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();
                    };
        }

最後に、仕様の 1 つから .BindModel() を実行すると、仕様が null 参照例外をスローします。

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

それが何であるかの手がかりはありますか?

必要に応じて、お気軽にお問い合わせください。私は何かを当然のことと思っていたかもしれません。

4

1 に答える 1

0

恐れ入りますが、質問から始めなければなりません。なぜデフォルトのモデル バインダーをテストしているのですか? DefaultModelBinderクラスはフレームワークの一部であるため、テストする責任はありません。動作中のブラック ボックスであると想定する必要があります。

とにかく、あなたのコードを見ると、あなたが達成しようとしているのは、バインドされたモデルをさらにテストすることだと思います。私は正しい軌道に乗っていますか?もしそうなら、 James Broome の MVC 向け MSpec 拡張機能を調べることをお勧めします。

ソースコードにはいくつかの例が付属しています。ただし、たとえば、コントローラーでアクションメソッドを呼び出し、(型指定された!) ViewModel (コントローラーアクションからビューに渡すもの) を操作することができます。

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

お役に立てれば

于 2010-05-16T11:15:49.360 に答える