Je suis actuellement en train de refactoriser du code qui exécute Windows Impersonation pour testabilité et qui s'est heurté à un peu d'un roadblock. Ceci est le bit de code que j'ai des problèmes avec:Mocking l'instanciation d'un objet pour un test unitaire
...
if (LogonUserA(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) > 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate))
{
var tempWindowsIdentity = new System.Security.Principal.WindowsIdentity(tokenDuplicate);
var impersonationContext = tempWindowsIdentity.Impersonate();
...
}
...
}
Comment puis-je me moque le comportement de l'instanciation d'un objet WindowsIdentity sur? J'ai pensé à diverses alternatives:
- passe dans une classe d'usine qui créerait l'instance et se moquer du comportement de cette
- Pass un délégué qui gère la création de l'instance (par exemple comme un pointeur de fonction C++)
Aucune de ces alternatives semblent particulièrement bon pour moi parce que je crains qu'ils brouillerait l'intention de la méthode que la signature de la méthode ressemblerait à quelque chose comme ce qui suit:
public bool Impersonate(string user, string password, string domain, Factory factory)
ou
public bool Impersonate(string user, string password, string domain, delegate WinIDCreator)
Parce que l'objectif de la méthode consiste à usurper l'identité d'un utilisateur particulier, il ne me fait pas sens que ce soit une classe d'usine ou délégué devraient lui être communiqués. Je veux isoler et mocker ce comportement cependant comme je suis mal à l'aise avec la pensée d'une nouvelle instance de WindowsIdentity étant créée chaque fois que je cours un tas de tests unitaires.
Des idées ou des commentaires?
Merci pour cela. J'aurais dû ajouter que j'ai encapsulé les choses de connexion dans une classe NativeMethods et je me moque simplement de celles-ci. L'inquiétude que j'ai avec l'injection de l'usine dans la classe est la même que l'utilisation comme une méthode param - il ne semble pas «naturel» d'avoir une classe qui dépend d'une usine de classe ... – jpoh
ie Cette classe effectue L'emprunt d'identité et donc il a une dépendance sur une classe NativeMethods (qui encapsule les choses de l'API Win dont j'ai besoin). Je trouve difficile de me convaincre que le fait d'avoir aussi une dépendance sur une classe Factory est OK. – jpoh