Moq: невозможно привести к интерфейсу - PullRequest
5 голосов
/ 06 мая 2010

ранее сегодня я задал этот вопрос .

Так как moq создает свой собственный класс из интерфейса, я не смог преобразовать его в другой класс.

Так что меня удивило, что если я создам ICustomPrincipal и попытаюсь привести его к этому.

Вот так выглядят мои издевательства:

var MockHttpContext = new Mock<HttpContextBase>();
var MockPrincipal = new Mock<ICustomPrincipal>();

MockHttpContext.SetupGet(h => h.User).Returns(MockPrincipal.Object);

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

var user = (ICustomPrincipal)httpContext.User;

Ошибка следующая:

Unable to cast object of type 'IPrincipalProxy4081807111564298854aabfc890edcc8' 
to type 'MyProject.Web.ICustomPrincipal'.

Полагаю, мне все еще нужно попрактиковаться с интерфейсами и moq, но разве я не смогу привести класс, созданный moq, обратно к ICustomPrincipal? Я знаю, что httpContext.User возвращает IPrincipal, так что, может быть, что-то там потеряно?

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

Pickels

Edit:
По просьбе полный код метода я тестирую. Это все еще не закончено, но это то, что я до сих пор:

public bool AuthorizeCore(HttpContextBase httpContext)
{
    if (httpContext == null)
    {
        throw new ArgumentNullException("httpContext");
    }

    var user = (ICustomPrincipal)httpContext.User;

    if (!user.Identity.IsAuthenticated)
    {
        return false;
    }

    return true;
}

Edit2:

Кажется, что если я использую Thread.CurrentPrincipal вместо HttpContext.current.user, я могу привести его без проблем. Читая о различиях между ними сейчас.

Ответы [ 4 ]

5 голосов
/ 27 июля 2010

Приведение с использованием .As (), см. http://code.google.com/p/moq/wiki/QuickStart#Advanced_Features

1 голос
/ 06 мая 2010

Ваш пример кода показывает, что вы издеваетесь над контекстом http и основными объектами.

Однако, в вашем примере кода, в котором вы пытаетесь получить пользователя, трудно определить, используете ли вы Mock httpконтекст или тот, который предоставлен фреймворком?

var user = (ICustomPrincipal)httpContext.User;

Используется ли указанная выше строка в методе или объекте с использованием внедрения зависимости?

Можете ли вы показать мне метод / объект в целом

0 голосов
/ 28 июля 2010

Я думаю, вам нужно уметь вставлять свои макеты в ваш код ...

Например, в вашем классе, если вы добавите следующее:

public static HttpContextBase HttpContext;
public static ICustomPrincipal User;

и иметь в своем коде следующее ...

var user = (ICustomPrincipal)User;

и в тестируемом классе (скажем, он называется ClassUnderTest)

ClassUnderTest.HttpContextBase = MockHttpContext.Object;

и

ClassUnderTest.User = MockPrincipal.Object;

хорошо ... я думаю, что это должно исправить все для вас.

0 голосов
/ 16 июня 2010

Я предполагаю, что у вас есть некоторая путаница в именах / интерфейсах. Вы уверены, что вы кастуете на тот же ICustomPrincipal, для которого вы создаете свой макет?

А почему в сообщении об ошибке говорится «IPrincipalProxy»? Вы издеваетесь над IPrincipal интерфейсом где-нибудь? Тогда какова связь между IPrincipal и ICustomPrincipal?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...