2010-04-25 4 views
0

BDD/TDD 기술을 사용하여 프로젝트를 개발 중이며 과정을 계속 유지하려고 노력 중입니다. 방금 만난 문제는 UnitModelBinder를 테스트하는 단위입니다. mspec을 사용하여 테스트를 작성합니다. 내 사양 컨텍스트를 짓고 있어요 방법은 다음과DefaultModelBinder를 테스트 할 때 NullReferenceException이 발생합니다.

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

     public string Body 
     { 
      get; set; 
     } 

    } 

:

은 내가 바인딩하려는이 같은 클래스가 있습니다. 가짜 폼 컬렉션을 만들고 bindingContext 객체에 채워 넣겠습니다.

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

모든 단서가 될 수있는 것을 : 나는 .BindModel이() 내 사양 중 하나 내부에서 실행할 때

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", "[email protected]"}, 
                   { "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(); 
        }; 
     } 

마지막으로, 내 스펙은 null 참조 예외가 발생합니다?

필요하면 자세한 정보를 언제든지 물어보십시오. 나는 무언가를 당연하게 생각했을지도 모른다.

답변

0

기본 모델 바인더를 테스트하는 이유는 무엇입니까? DefaultModelBinder 클래스는 프레임 워크의 일부이므로 테스트하는 것은 사용자의 책임이 아닙니다. 작동하는 블랙 박스라고 가정해야합니다.

어쨌든 코드를 보면 내가 성취하고자하는 것은 바운드 모델을 추가로 테스트하는 것이라고 생각합니다. 나는 올바른 길을 가고 있는가? 그렇다면, 나는 당신을 들여다 보길 권합니다. James Broome's MSpec extensions for MVC

소스 코드는 몇 가지 예제와 함께 제공됩니다; 그러나 당신이, 예를 들어, 단순히

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

희망이를 수행하여 (입력!)의 ViewModel (당신이 컨트롤러 액션에서보기에 전달할 것)에 컨트롤러 행동에 액션 메소드를 호출 할 수 있습니다 도와주세요