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");