Unit Test (MVC) -проблема с ролями - PullRequest
5 голосов
/ 04 января 2011

У меня есть приложение mvc, и я работаю с объектами poco и пишу юнит-тест.Проблема в том, что все мои тесты не пройдены, когда они достигают этой строки кода Roles.IsUserInRole ("someUser", "role").Должен ли я реализовать новый интерфейс или хранилище для ролей или ...?Thx

Ответы [ 3 ]

11 голосов
/ 04 января 2011

У меня была такая же проблема при попытке смоделировать функциональность Roles.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 в своих тестах, пример, показанный здесь, использует Rhino Mocks:

var roleProvider = MockRepository.GenerateStub<IRoleProvider>();
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true);

Надеюсь, это поможет.

0 голосов
/ 26 февраля 2015

Вы можете создать легкую оболочку с помощью Predicate / Func.

public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role);

Затем используйте IsUserInRole () вместо Roles.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, а затем контролировать возвращаемое значение и / или проверить, был ли вызван метод.И проверьте, какое значение параметра было отправлено в предикат.

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());
0 голосов
/ 05 января 2011

Вы можете настроить собственный метод для проверки ролей, которые будут вести себя по-разному в тестах, но я предпочитаю, чтобы тесты устанавливали контекст, который будет работать со стандартными методами.

http://stephenwalther.com/blog/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspx

...