Moq:无法转换为界面

时间:2010-05-05 21:33:06

标签: c# asp.net-mvc moq

今天早些时候我问过question

因此,由于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

修改:
根据要求,我正在测试的方法的完整代码。它还没有完成,但这是我到目前为止所做的:

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 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

您的代码示例显示您正在模拟http上下文和主要对象。

但是,您尝试获取用户的代码示例很难确定您是使用Mock http上下文还是框架提供的上下文?

var user = (ICustomPrincipal)httpContext.User;

上述行是否在使用依赖注入的方法或对象中使用?

你能告诉我整个方法/对象吗?

答案 2 :(得分:0)

我猜你在命名空间/接口名称中有些混乱。 你确定,你正在为你创建模拟的同一个ICustomPrincipal投射吗?

为什么在错误消息中说“IPrincipalProxy”?你在某处嘲笑IPrincipal接口吗?那么IPrincipalICustomPrincipal之间的关系是什么?

答案 3 :(得分:0)

我认为你需要能够将你的模拟注入你的代码......

例如,在您的课程中添加以下内容:

public static HttpContextBase HttpContext;
public static ICustomPrincipal User;

并在您的代码中包含以下内容......

var user = (ICustomPrincipal)User;

并且在您的测试类中(比如它被命名为ClassUnderTest)

ClassUnderTest.HttpContextBase = MockHttpContext.Object;

ClassUnderTest.User = MockPrincipal.Object;
好吧......我认为这应该能解决问题。