2009-07-20 7 views
1

Je me moque d'un objet HttpRequest en utilisant Moq pour le test unitaire dans ASP.NET MVC. J'ai besoin de définir l'un des ServerVariables (LOGON_USER) dans la requête. Est-ce possible? J'ai essayé d'utiliser la méthode suivante, mais j'obtiens une exception car la collection ServerVariables n'est pas redéfinissable.Définir une valeur ServerVariable en se moquant de HttpRequest à l'aide de Moq?

request.SetupGet(req => req.ServerVariables["LOGON_USER"]).Returns(@"TestUserName"); 

Est-il possible de définir une valeur ServerVariable pour le test? Dois-je passer une nouvelle NameValueCollection plutôt que d'essayer de définir une clé spécifique?

+0

Voir ma réponse ici: http: // stackoverflow. com/A/34194622/573045 – Birey

Répondre

0

Ok, figurés celui-ci dehors. J'ai créé cette méthode pour créer NameValueCollection pour les ServerVariables:

private static NameValueCollection CreateServerVariables(string logonUserName) 
{ 
    var collection = new NameValueCollection {{"LOGON_USER", logonUserName}}; 
    return collection; 
} 

Alors je l'ai appelé comme ça dans ma configuration:

var request = new Mock<HttpRequestBase>(); 

    request.SetupGet(req => req.ServerVariables).Returns(CreateServerVariables(userName)); 
1

C'est une façon de le faire. Je me moque habituellement de ces choses en changeant les règles: je ne veux pas savoir sur HttpRequest ou ses proches dans mes tests. Au lieu de cela, je demande: Où puis-je obtenir le nom de l'utilisateur connecté si je devais décider?

Et ce serait un ICallerContext ou tout autre nom que nous pourrions trouver. Ensuite, je me moque de cette interface à la place.

Mon contrôleur besoin d'une référence à la nouvelle dépendance:

public class MyController 
{ 
    public MyController(ICallerContext caller) {...} 
} 

Mon besoin de test pour passer l'instance moquée au contrôleur:

var caller = new Mock<ICallerContext>(); 
var controller = new MyController(caller.Object); 

caller.Setup(c => c.LogonUserName).Returns("TestUserName"); 

controller.DoTheMagic(); 

//Assertion(s) goes here... 
Questions connexes