Moq:无法转换为界面

Pic*_*els 5 c# asp.net-mvc moq

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

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

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

这是我的嘲笑的样子:

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

MockHttpContext.SetupGet(h => h.User).Returns(MockPrincipal.Object);
Run Code Online (Sandbox Code Playgroud)

在我试图测试以下代码的方法给出错误(再次):

var user = (ICustomPrincipal)httpContext.User;
Run Code Online (Sandbox Code Playgroud)

错误如下:

Unable to cast object of type 'IPrincipalProxy4081807111564298854aabfc890edcc8' 
to type 'MyProject.Web.ICustomPrincipal'.
Run Code Online (Sandbox Code Playgroud)

我想我仍然需要接口和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;
}
Run Code Online (Sandbox Code Playgroud)

EDIT2:

似乎如果我使用Thread.CurrentPrincipal而不是HttpContext.current.user,我可以毫无问题地投射它.现在阅读两者之间的差异.

小智 0

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

例如,在您的班级中,如果您添加以下内容:

public static HttpContextBase HttpContext;
public static ICustomPrincipal User;
Run Code Online (Sandbox Code Playgroud)

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

var user = (ICustomPrincipal)User;
Run Code Online (Sandbox Code Playgroud)

并在您的测试类中(假设它名为 ClassUnderTest)

ClassUnderTest.HttpContextBase = MockHttpContext.Object;
Run Code Online (Sandbox Code Playgroud)

ClassUnderTest.User = MockPrincipal.Object;
Run Code Online (Sandbox Code Playgroud)

嗯...我认为这应该可以解决你的问题。