Moq custom IIdentity

Я создал настраиваемый RoleProvider (стандартные webforms, no mvc), и я бы хотел его протестировать. Сам поставщик интегрируется с пользовательской реализацией IIdentity (с некоторыми добавленными свойствами).

У меня есть это на данный момент:

var user = new Mock<IPrincipal>();
var identity = new Mock<CustomIdentity>();

user.Setup(ctx => ctx.Identity).Returns(identity.Object);
identity.SetupGet(id => id.IsAuthenticated).Returns(true);
identity.SetupGet(id => id.LoginName).Returns("test");

// IsAuthenticated is the implementation of the IIdentity interface and LoginName 

Однако, когда я запускаю этот тест в VS2008, я получаю следующее сообщение об ошибке:

Неверная настройка для неперехваченного элемента: id = > id.IsAuthenticated

Почему это происходит? И самое главное, что мне нужно сделать, чтобы решить эту проблему?

Grz, Kris.

+1
27 июл. '09 в 12:24
источник поделиться
2 ответа

Вы должны издеваться над IIdentity (вместо CustomIdentity - возможно только в том случае, если переменные, которые вы издеваетесь, объявлены в интерфейсе) или объявите используемые переменные как виртуальные.


Чтобы отметить как виртуальное, сделайте следующее: в своем конкретном классе CustomIdentity используйте

public virtual bool isAuthenticated { get; set; }

вместо

public bool isAuthenticated { get; set; }

Moq и другие бесплатные mocking frameworks не позволяют вам издеваться над членами и методами конкретных типов классов, если только они не помечены как виртуальные.

Наконец, вы можете создать макет самостоятельно. Вы можете наследовать CustomIdentity для тестового класса, который вернет значения по вашему желанию. Что-то вроде:

internal class CustomIdentityTestClass : CustomIdentity
{
    public new bool isAuthenticated
    {
        get
        {
            return true;
        }
    }

    public new string LoginName
    {
        get
        {
            return "test";
        }
    }

}

Этот класс будет использоваться только в тестировании, как макет для вашей пользовательской индивидуальности.

- EDIT

Ответьте на вопрос в комментариях.

+3
27 июл. '09 в 12:36
источник

Вы издеваетесь над интерфейсом IIdentity или издеваетесь над своим пользовательским типом?

Не имея более полного фрагмента кода, чтобы посмотреть, я предполагаю, что он жалуется, что IsAuthenticated не помечен как виртуальный в вашей пользовательской реализации. Однако это может быть только в том случае, если вы издевались над конкретным типом, а не с интерфейсом.

0
27 июл. '09 в 12:33
источник

Посмотрите другие вопросы по меткам или Задайте вопрос