2009-07-27 1 views
1

Я создал пользовательский RoleProvider (стандартные веб-формы, без mvc), и я бы хотел его протестировать. Сам провайдер интегрируется с пользовательской реализацией IIdentity (с некоторыми добавленными свойствами).Moq custom 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.IsAuthenticated

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

Grz, Kris.

ответ

3

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


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

public virtual bool isAuthenticated { get; set; } 

вместо

public bool isAuthenticated { get; set; } 

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

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

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

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

} 

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

--EDIT

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

+0

Что вы подразумеваете под объявлением используемых переменных в качестве виртуальных? Вы имеете в виду сам тест? – XIII

+0

@ XIII добавленный информация.Это должно быть сделано в вашем конкретном классе –

+0

Thx для пояснения. Однако у меня нет доступа к коду пользовательской реализации IIdentity. Есть ли обходной путь? – XIII

0

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

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

+0

Я действительно издеваюсь над конкретным классом, поскольку это обычная реализация IIdentity из другой команды, поставленной как сборка. Свойство IsAuthenticated не является виртуальным (и не является свойством LoginName). – XIII

+0

ok - тогда вам нужно будет пометить IsAuthenticated как виртуальный в вашем конкретном классе. Это должно решить проблему. –

+0

Читая ваши ответы ниже, кажется, что у вас нет возможности пометить это как виртуальное. В этом случае вы * можете * хотеть рассмотреть возможность размещения собственного класса * wrapper * вокруг класса «unmockable» и использования этого в вашем коде. Затем вы можете обеспечить, чтобы обертка была макетной. См. Сообщение от меня несколько дней назад об этом: http://stackoverflow.com/questions/1182338/1182430#1182430 –

Смежные вопросы