0

J'essaie de tester un modèle de classeur personnalisé. En particulier, je souhaite voir comment il réagit aux diverses valeurs (éventuellement conflictuelles) soumises dans la demande. Collections .Form et Request.QueryString - ie si je soumets une valeur dans le formulaire et une autre dans la chaîne de requête (ouais, ouais, je sais, c'est mal, mais je veux une couverture de test au cas où ça arrive) Je peux valider exactement sera lié au modèle. Pour ce faire, je voudrais simuler/simuler le contexte HTTP, puis invoquer le classeur modèle et voir ce qui est réellement retourné. J'ai vu plusieurs articles sur le test de ModelBinders, mais tous utilisent un ValueProvider personnalisé, alors que je veux tester la façon dont MVC interagit avec les collections Form/Request.Test de ModelBinder personnalisé par rapport au contexte HTTP dans ASP.NET MVC (1.0)

Des idées comment je peux me moquer de ces collections, puis faire en sorte que mon classeur modèle utilise le ValueProvider 'par défaut' basé sur ce contexte HTTP simulé dans mes tests d'unités? C'est sur ASP.NET MVC 1.0. Merci.

Répondre

0

Cloué lui - la solution est de se moquer de la ControllerContext, puis construire une nouvelle System.Web.Mvc.ValueProviderDictionary et passez votre contexte de contrôleur moqué dans le constructeur, comme suit:

[Test] 
public void WorkFolder_Id_Is_Parsed_From_QueryString() { 

    var fakeControllerContext = GetControllerContext(null, "folder=10"); 

    var bindingContext = new ModelBindingContext() { 
     ValueProvider = new System.Web.Mvc.ValueProviderDictionary(fakeControllerContext), 
     ModelName = "menu", 
     FallbackToEmptyPrefix = true 

    }; 
    var binder = new RenewalMenuPostModelBinder(); 
    var model = binder.BindModel(fakeControllerContext, bindingContext) as RenewalMenuPostModel; 
    Assert.That(model is RenewalMenuPostModel); 
    Assert.That(model.WorkFolderId.HasValue); 
    Assert.That(model.WorkFolderId.Value == 10); 

} 



private static ControllerContext GetControllerContext(NameValueCollection form, string queryString) { 
    Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>(); 
    mockRequest.Expect(r => r.Form).Returns(form); 

    var queryStringCollection = HttpUtility.ParseQueryString(queryString); 
    mockRequest.Expect(r => r.QueryString).Returns(queryStringCollection); 

    Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>(); 
    mockHttpContext.Expect(c => c.Request).Returns(mockRequest.Object); 

    return new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock<ControllerBase>().Object); 
} 
Questions connexes