Moq:无法转换为界面

我今天早些时候问过这个问题 。

因此,由于moq从一个接口创建它自己的类,我无法将它转换为另一个类。

所以它让我想知道如果我创建了一个ICustomPrincipal并尝试强制转换它。

这是我的嘲笑的样子:

var MockHttpContext = new Mock(); var MockPrincipal = new Mock(); 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,我可以毫无问题地投射它。 现在阅读两者之间的差异。

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

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

 public static HttpContextBase HttpContext; public static ICustomPrincipal User; 

并在您的代码中有以下内容……

 var user = (ICustomPrincipal)User; 

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

 ClassUnderTest.HttpContextBase = MockHttpContext.Object; 

 ClassUnderTest.User = MockPrincipal.Object; 

嗯……我认为这应该能解决你的问题。

使用.As()进行投射,请参阅http://code.google.com/p/moq/wiki/QuickStart#Advanced_Features

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

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

 var user = (ICustomPrincipal)httpContext.User; 

上面的行是在使用dependency injection的方法或对象中使用的吗?

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

我猜你在命名空间/接口名称中有些混乱。 你确定,你正在使用相同的ICustomPrincipal ,为此你创建了你的模拟?

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