10
votes

Se moquer d'un membre des membres

Je développe actuellement une application ASP.NET MVC 2 qui utilise la valeur par défaut SQLMembershipProvider pour l'authentification. J'ai mis en place une méthode de contrôleur qui lit le fournisseurAuserkey de l'utilisateur actuel en appelant Membership.geturer (). ProvidentAserkey Code>. Maintenant, j'essaie d'écrire quelques méthodes de test pour ce contrôleur.

Pour vous débarrasser de la dépendance sur la classe d'adhésion statique, j'ai créé une mince emballage et montrant mon contrôleur dépend de l'interface correspondante: P>

public interface IStaticMembershipService {
    MembershipUser GetUser();

    void UpdateUser(MembershipUser user);
}


0 commentaires

4 Réponses :


1
votes

Quelque chose de similaire à celui-ci:

var user = new MembershipUser();
var membershipService = new Mock<IStaticMembershipService>();
membershipService.Setup(p => p.GetUser()).Returns(user);


0 commentaires

12
votes

Il ressemblerait à ceci comme ceci:

var userMock = new MembershipUser {ProviderUserKey = guid};


1 commentaires

Merci beaucoup, créant une maquette de la classe des membres qui travaille bien.



2
votes

Je pense que vous devez séparer vos spécificités de mise en œuvre de l'interface que le consommateur se soucie vraiment. Je ne suis pas sûr de ce que votre contrôle a besoin du fournisseurAuserkey pour, si cela le jette à une classe spécifique, etc., mais je regarderais à faire de votre interface répondant aux besoins du contrôleur, pas l'inverse. Quelque chose comme (sans savoir plus de détails): xxx pré>

Une fois que vous avez fait ce niveau d'abstraction, alors vous moquez devient beaucoup plus facile, car vous pouvez simplement faire: P>

membershipService.Setup (svc => svc.UserKey).Returns (myGuid);


0 commentaires

0
votes

Pourriez-vous faire quelque chose comme ci-dessous si vous avez besoin de se moquer de la marque httpcontext aussi. Ci-dessous utilise Nunit A > et MOQ .

[SetUp]
private void Setup()
{
    _mockHttpContext = new Mock<HttpContextBase>();
    _mockStaticMembership = new Mock<IStaticMembershipService>();           
    _mockUser = new Mock<MembershipUser>();
    _mockPrincipalUser = new Mock<IPrincipal>();        

    _mockHttpContext.Setup(http => http.User).Returns( _mockPrincipalUser.Object );
    _mockPrincipalUser.Setup(principal => principal.Identity.Name).Returns("myname");
    _mockUser.Setup(user => user.ProviderUserKey).Returns( Guid.NewGuid() );

    _mockStaticMembership.Setup(membership => membership.GetUser(It.IsAny<string>())).Returns( _mockUser.Object );

}

[Test]
public void Some_Test_For_My_Controller()
{            
    var controller = new MyController( _mockStaticMembership.Object );            
    controller.ControllerContext = new ControllerContext(_mockHttpContext.Object, new RouteData(), controller);

    //Test your action and verify   
}


0 commentaires