2010-09-08 20 views
0

J'ai une règle de sécurité selon laquelle un nouvel utilisateur a des autorisations complètes sur sa propre entité utilisateur. J'utilise Rhino.Security et le code fonctionne bien, mais je veux créer un test unitaire pour m'assurer que l'appel approprié est fait pour configurer l'autorisation. Voici une verison simplifiée du code:Comment tester si une méthode de service fluide est appelée

public User Register(UserRegisterTask userRegistrationTask) { 
    User user = User.Create(userRegistrationTask); 
    this.userRepository.Save(user); 

    // Give this user permission to do operations on itself 
    this.permissionsBuilderService.Allow("Domain/User") 
     .For(user) 
     .On(user) 
     .DefaultLevel() 
     .Save(); 

    return user; 
} 

Je suis moqué des userRepository et permissionBuilderService, mais l'interface fluide du permissionBuilderService nécessite différents objets à renvoyer de chaque appel de méthode dans la chaîne (c.-à-(Laissez charger ...) Pour (...). Sur (...) etc). Mais je ne peux pas trouver un moyen de se moquer de chacun des objets de la chaîne.

Existe-t-il un moyen de tester si la méthode Allow de permissionBuilderService est appelée mais en ignorant le reste de la chaîne?

Merci Dan

+0

Le vrai permissionsBuilderService a-t-il des effets secondaires? (c'est-à-dire serait-il possible d'utiliser le vrai dans les tests?) – Grzenio

+0

Le vrai permissionsBuilderService s'attend à ce qu'une vraie base de données soit attachée. C'est possible mais il faut configurer le db et l'abattre pour chacun de ces types de tests. J'espérais quelque chose de moins exigeant. – Dan

Répondre

0

J'ai aussi couru sur cette question et a fini par envelopper la fonctionnalité de sécurité Rhino dans une couche de service pour deux raisons:

  1. Il a été l'unité de fabrication de tester un véritable PITA et après avoir passé une quelques heures en me cognant la tête contre un mur de brique, cette approche m'a permis de me moquer de cette couche beaucoup plus facilement.
  2. J'ai commencé à sentir que Rhino Security était couplé très étroitement à mon contrôleur (mon application utilise MVC). Envelopper les appels dans une autre couche m'a permis de me relier plus librement à une implémentation de sécurité spécifique et me permettra de l'échanger facilement avec un autre - si je le souhaite - dans le futur.

Évidemment, ce n'est qu'une approche. Mais cela m'a simplifié la vie ...