2009-07-27 6 views
1

J'ai créé un RoleProvider personnalisé (webforms standard, pas mvc) et je voudrais le tester. Le fournisseur lui-même s'intègre à une implémentation personnalisée de IIdentity (avec quelques propriétés ajoutées).Moq custom IIdentity

J'ai ce au moment:

var user = new Mock<IPrincipal>(); 
var identity = new Mock<CustomIdentity>(); 

user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
identity.SetupGet(id => id.IsAuthenticated).Returns(true); 
identity.SetupGet(id => id.LoginName).Returns("test"); 

// IsAuthenticated is the implementation of the IIdentity interface and LoginName 

Cependant quand je lance ce test dans VS2008 puis je reçois le message d'erreur suivant:

configuration non valide sur un membre non-substituable: id => id.IsAuthenticated

Pourquoi cela se produit-il? Et le plus important, que dois-je faire pour le résoudre?

Grz, Kris.

Répondre

3

Vous devez simuler IIdentity (au lieu de CustomIdentity - uniquement possible si les variables que vous moquez sont déclarées dans l'interface) ou déclarer les variables utilisées comme virtuelles.


marquer comme virtuelle, faites ceci: Dans votre CustomIdentity classe béton, utilisez

public virtual bool isAuthenticated { get; set; } 

au lieu de

public bool isAuthenticated { get; set; } 

Moq et d'autres cadres moqueurs libre ne pas laissez-vous vous moquer des membres et des méthodes de types de classes concrets, à moins qu'ils ne soient marqués virtuels. Enfin, vous pouvez créer vous-même le simulacre manuellement.

Vous pourriez hériter CustomIdentity d'une classe de test, qui renverrait les valeurs comme vous le vouliez. Quelque chose comme:

internal class CustomIdentityTestClass : CustomIdentity 
{ 
    public new bool isAuthenticated 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public new string LoginName 
    { 
     get 
     { 
      return "test"; 
     } 
    } 

} 

Cette classe serait utilisée uniquement dans les tests, en tant que simulacre pour votre CustomIdentity.

--EDIT

Répondre à la question dans les commentaires.

+0

Que voulez-vous dire par déclarer les variables utilisées en tant que virtuelles? Tu veux dire dans mon test lui-même? – XIII

+0

@XIII explication ajoutée.Cela devrait être fait dans votre classe concrète –

+0

Thx pour explication. Cependant, je n'ai pas accès au code de l'implémentation IIdentity personnalisée. Y at-il un travail autour? – XIII

0

Vous vous moquez de l'interface IIdentity ou vous vous moquez de votre type personnalisé? Sans avoir un extrait de code plus complet à regarder, je suppose qu'il se plaint que l'IsAuthenticated n'est pas marqué comme virtuel dans votre implémentation personnalisée. Cependant, cela ne pourrait être le cas que si vous vous moquiez du type concret, pas de l'interface.

+0

Je me moque bien de la classe concrète car il s'agit d'une implémentation personnalisée de IIdentity d'une autre équipe livrée en assemblée. La propriété IsAuthenticated n'est pas virtuelle (ni la propriété LoginName). – XIII

+0

ok - alors vous devrez marquer IsAuthenticated comme virtuel dans votre classe concrète. Cela devrait résoudre le problème. –

+0

En lisant vos réponses ci-dessous, il semble que vous n'ayez pas la possibilité de marquer cela comme virtuel. Dans ce cas, vous pouvez * envisager * de placer votre propre classe * wrapper * autour de la classe "unmockable" et de l'utiliser dans votre code. Vous pouvez ensuite vous assurer que le wrapper est facettable. Voir un message par moi à partir de quelques jours à ce sujet: http://stackoverflow.com/questions/1182338/1182430#1182430 –