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
界面吗? 那么IPrincipal
和ICustomPrincipal
之间的关系是什么?