Domanda

Ho applicazione MVC e sto lavorando con oggetti Poco e unit test di scrittura. Il problema è che tutta la mia prova non riuscire quando raggiungono questa riga di codice Roles.IsUserInRole ( "QualcheUtente", "ruolo"). Devo implementare la nuova interfaccia o repository per ruoli o ...? Thx

È stato utile?

Soluzione

Ho avuto lo stesso problema quando si cerca di prendere in giro la funzionalità Roles.IsUserInRole nel mio test di unità codificati. La mia soluzione era quella di creare una nuova classe chiamata RoleProvider e un'interfaccia con il metodo IsUserInRole, che allora si chiamava la System.Web.Security.Roles.IsUserInRole:

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

Poi, nel mio codice chiamo il metodo RoleProvider IsUserInRole. Come si dispone di un'interfaccia è possibile prendere in giro l'IRoleProvider nei test, ad esempio mostrato qui è con Rhino Mocks:

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

Spero che questo aiuti.

Altri suggerimenti

È possibile impostare un metodo personalizzato per controllare i ruoli che si comportano in modo diverso nei test, ma io preferisco avere le prove di istituire un contesto che lavorerà con i metodi standard.

http://stephenwalther.com/blog/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspx

Si potrebbe creare un involucro leggero con un predicato / Funz.

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

Quindi utilizzare IsUserInRole () al posto di Roles.IsUserInRole (). In fase di esecuzione si ottiene lo stesso comportamento. Ma al tempo di prova è possibile ignorare la funzione in modo che non acceda alla RoleProvider

MyClass.IsUserInRole = role => true;

Se si preferisce non avere un pubblico statico si potrebbe iniettare il predicato tramite il costruttore e conservarlo come un privato in sola lettura.

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

Se si utilizza Moq è possibile restituire un modello e quindi controllare il valore di ritorno e / o controllare il metodo è stato chiamato. E verificare che valore del parametro è stato inviato al predicato.

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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top