Модульный тест (MVC) -Прозрать с ролями
-
15-10-2019 - |
Вопрос
У меня есть приложение MVC, и я работаю с объектами Poco и письменным модульным тестом. Проблема заключается в том, что весь мой тест не пройдет, когда они достигают этой строки кодовых ролей. Isuserinrole («SomeUser», «Роль»). Должен ли я реализовать новый интерфейс или репозиторий для ролей или ...? Спасибо
Решение
У меня была такая же проблема при попытке издеваться над ролями. Функциональность IsuserInrole в моих кодированных модульных тестах. Мое решение состояло в том, чтобы создать новый класс под названием Roleprovider и интерфейс с методом isuserinrole, который затем назвал System.Web.Security.Roles.IsuserInrole:
public class RoleProvider: IRoleProvider
{
public bool IsUserInRole(IPrincipal userPrincipal)
{
return System.Web.Security.Roles.IsUserInRole(userPrincipal.Identity.Name, "User");
}
}
Затем в своем коде я называю метод roleprovider isuserinrole. Поскольку у вас есть интерфейс, вы можете издеваться над Iroleprovider в ваших тестах, пример, показанный здесь
var roleProvider = MockRepository.GenerateStub<IRoleProvider>();
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true);
Надеюсь это поможет.
Другие советы
Вы можете настроить пользовательский метод для проверки ролей, который будет вести себя по -разному в тестах, но я предпочитаю, чтобы тесты устанавливали контекст, который будет работать со стандартными методами.
Вы можете создать легкую обертку с предикатом/функцией.
public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role);
Затем используйте isuserinRole () вместо роли. IsuserinRole (). Во время выполнения вы получаете такое же поведение. Но во время тестирования вы можете переопределить функцию, чтобы она не имела доступа к RoleProvider
MyClass.IsUserInRole = role => true;
Если вы предпочитаете не иметь публичной статики, вы можете ввести предикат через свой конструктор и сохранить его как частное чтение.
class MyClass
{
private readonly Predicate<string> IsUserInRole;
MyClass(Predicate<string> roleChecker) { this.IsUserInRole = roleChecker }
MyClass() : this(role => Roles.IsUserInRole(role)) { }
}
Если вы используете MOQ, вы можете вернуть макет, а затем контролировать возвращаемое значение и/или проверить, что был вызван метод. И проверьте, какое значение параметра было отправлено в предикат.
Mock<Predicate<string>> mockRoleChecker = new Mock<Predicate<string>>();
var cut = new MyClass(mockRoleChecker.Object);
var expectedRole = "Admin";
mockRoleChecker.SetReturnsDefault<bool>(true); // if not specified will return false which is default(bool)
cut.MyMethod();
mockRoleChecker.Verify(x => x(expectedRole), Times.Once());