Podczas pisania testów jednostkowych możemy natknąć się na problem uprawnień – co jeśli testowana metoda wymaga, aby użytkownik był zalogowany, miał określoną nazwę bądź był przypisany do konkretnej roli? Nie chcemy przecież, aby testy jednostkowe w jakiś sposób logowały się do naszej aplikacji. Rozwiązaniem jest pomocnicza klasa, którą napisałem z wykorzystaniem frameworka Moq:
1: public static class PrincipalMock
2: {
3: public static IPrincipal Create(string name, params string[] roles)
4: {
5: var identity = new Mock<IIdentity>();
6: identity.Setup(x => x.Name).Returns(name);
7: identity.Setup(x => x.IsAuthenticated).Returns(!string.IsNullOrEmpty(name));
8:
9: var principal = new Mock<IPrincipal>();
10: principal.Setup(x => x.Identity).Returns(identity.Object);
11: roles.ToList().ForEach(role => principal.Setup(x => x.IsInRole(role)).Returns(true));
12:
13: return principal.Object;
14: }
15: }
Jej wykorzystanie, na przykład w metodzie z atrybutem SetUp (w przypadku nUnit) wykonywanej przed każdym testem:
1: Thread.CurrentPrincipal = PrincipalMock.Create("username", "role1", "role2");