Вопрос

У меня есть приложение 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);

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

Другие советы

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

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

Вы можете создать легкую обертку с предикатом/функцией.

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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top