2010-01-02 21 views

cevap

41

...

[Test] 
public void Date_Can_Be_Pulled_Via_Provided_Month_Day_Year() 
{ 
    // Arrange 
    var formCollection = new NameValueCollection { 
     { "foo.month", "2" }, 
     { "foo.day", "12" }, 
     { "foo.year", "1964" } 
    }; 

    var valueProvider = new NameValueCollectionValueProvider(formCollection, null); 
    var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(FwpUser)); 

    var bindingContext = new ModelBindingContext 
    { 
     ModelName = "foo", 
     ValueProvider = valueProvider, 
     ModelMetadata = modelMetadata 
    }; 

    DateAndTimeModelBinder b = new DateAndTimeModelBinder { Month = "month", Day = "day", Year = "year" }; 
    ControllerContext controllerContext = new ControllerContext(); 

    // Act 
    DateTime result = (DateTime)b.BindModel(controllerContext, bindingContext); 

    // Assert 
    Assert.AreEqual(DateTime.Parse("1964-02-12 12:00:00 am"), result); 
} 
+0

Cevabınız beni MVC kaynağında dolanmadan kurtardı. Aynı güncellemeyi yapmaya çalıştım ve neredeyse aynı sonuçla geldi. Ne yazık ki, 'ModelMetaData'' 'ModelBindingContext' üzerinde ayarlamıyordum. Bu olmadan, BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) 'üzerinde bir NullReferenceException dizini alırsınız. – patridge

+0

Bunun için teşekkürler. Benim için bazı şeyleri güzelce temizledi. –

+0

Özel bir ValueProvider oluşturmak üzereydim, ama bahsettiğiniz NameValueCollectionValueProvider sayesinde. Bu yararlı oldu. Teşekkürler. – Mani

1

Genel yaklaşım, bir Mock ControllerContext oluşturmak, ModelBindingContext alay ve PropertyDescriptor alay ve sonra yöntemi çağırmaktır.

Model bağlayıcınız sizinki gibi görünen başka hizmetler kullanıyorsa (NHibernate kullanıyor musunuz?), O zaman bunları tasarlamak ve bunlara alay etmek zorundasınız.

// Arrange 
ControllerContext mockControllerContext = ...; 
ModelBindingContext mockModelBindingContext = ...; 
PropertyDescriptor mockPropertyDescriptor = ...; 
SomeService mockService = ...; 

TaskFormBinder taskFormBinder = new TaskFormBinder(); 
taskFormBinder.Service = mockService; 

// Act 
taskFormBinder.BindProperty(
    mockControllerContext, mockModelBindingContext, mockPropertyDescriptor); 

// Assert 
// ... here you need to inspect the values in the model binding context to see that it set the right properties 

Ne sorunu (ler) birim testi yazma yaşıyorsanız:

birim test kodu şöyle bir şey olacaktır?

Ben ASP.Net MVC 2 modeli bağlayıcılar test etmek Hanselman's MVC 1 example modifiye ettik
+0

Sadece ControllerContext, ModelBindingContext ve PropertyDescriptor alay örneği gerekir. Evet, NHibernate kullanıyorum ama bu katmanın ne kadar soyut ve alay ettiğini biliyorum. –

+0

'ModelBindingContext' ile alay etmenin bir problemi, en önemli özelliklerinin (' ModelType') sanal olmaması, yani miras temelli çerçevelerin (ör., Moq) davranışlarını taklit edememesidir. –