Question

Je demande et je mvc travaille avec des objets poco et unité d'écriture test. Le problème est que tout mon échec du test quand ils atteignent cette ligne de code Roles.IsUserInRole ( « someUser », « rôle »). Dois-je mettre en œuvre la nouvelle interface ou un référentiel pour les rôles ou ...? Thx

Était-ce utile?

La solution

J'ai eu le même problème en essayant de se moquer de la fonctionnalité Roles.IsUserInRole dans mes tests unitaires codés. Ma solution a été de créer une nouvelle classe appelée RoleProvider et une interface avec la méthode IsUserInRole qui a ensuite appelé le System.Web.Security.Roles.IsUserInRole:

public class RoleProvider: IRoleProvider
{
    public bool IsUserInRole(IPrincipal userPrincipal)
    {
        return System.Web.Security.Roles.IsUserInRole(userPrincipal.Identity.Name, "User");
    }
}

Alors dans mon code j'appelle la méthode RoleProvider IsUserInRole. Comme vous avez une interface, vous pouvez alors se moquer de la IRoleProvider dans vos tests, par exemple montré ici utilise Rhino Mocks:

var roleProvider = MockRepository.GenerateStub<IRoleProvider>();
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true);

Hope this helps.

Autres conseils

Vous pouvez configurer une méthode personnalisée pour vérifier les rôles qui se comportent différemment dans les tests, mais je préfère avoir les essais mis en place un contexte qui travaillera avec les méthodes standard.

Vous pouvez créer un emballage léger avec un prédicats / Func.

public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role);

Utilisez ensuite IsUserInRole () au lieu de Roles.IsUserInRole (). Au moment de l'exécution, vous obtenez le même comportement. Mais au moment de test, vous pouvez remplacer la fonction afin qu'elle n'a pas accès à la RoleProvider

MyClass.IsUserInRole = role => true;

Si vous préférez ne pas avoir un public static vous pouvez injecter le prédicats par votre constructeur et l'enregistrer comme readonly privé.

class MyClass
{    
    private readonly Predicate<string> IsUserInRole;
    MyClass(Predicate<string> roleChecker) { this.IsUserInRole = roleChecker }
    MyClass() : this(role => Roles.IsUserInRole(role)) { }
}

Si vous utilisez Moq vous pouvez retourner une maquette, puis contrôler la valeur de retour et / ou vérifier la méthode a été appelée. Et vérifier que la valeur du paramètre a été envoyé au prédicats.

Mock<Predicate<string>> mockRoleChecker = new Mock<Predicate<string>>();
var cut = new MyClass(mockRoleChecker.Object);
var expectedRole = "Admin";
mockRoleChecker.SetReturnsDefault<bool>(true);  // if not specified will return false which is default(bool)

cut.MyMethod();

mockRoleChecker.Verify(x => x(expectedRole), Times.Once());
scroll top