今天早些时候我问过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,我可以毫无问题地使用它。现在阅读两者之间的差异。
答案 0 :(得分:5)
答案 1 :(得分:1)
您的代码示例显示您正在模拟http上下文和主要对象。
但是,您尝试获取用户的代码示例很难确定您是使用Mock http上下文还是框架提供的上下文?
var user = (ICustomPrincipal)httpContext.User;
上述行是否在使用依赖注入的方法或对象中使用?
你能告诉我整个方法/对象吗?
答案 2 :(得分:0)
我猜你在命名空间/接口名称中有些混乱。
你确定,你正在为你创建模拟的同一个ICustomPrincipal
投射吗?
为什么在错误消息中说“IPrincipalProxy”?你在某处嘲笑IPrincipal
接口吗?那么IPrincipal
和ICustomPrincipal
之间的关系是什么?
答案 3 :(得分:0)
我认为你需要能够将你的模拟注入你的代码......
例如,在您的课程中添加以下内容:
public static HttpContextBase HttpContext;
public static ICustomPrincipal User;
并在您的代码中包含以下内容......
var user = (ICustomPrincipal)User;
并且在您的测试类中(比如它被命名为ClassUnderTest)
ClassUnderTest.HttpContextBase = MockHttpContext.Object;
和
ClassUnderTest.User = MockPrincipal.Object;
好吧......我认为这应该能解决问题。