我无法找到下面的代码行的模拟。
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;当我试图嘲弄时,我就会犯错。
“System.NullReferenceException”类型的异常发生在Microsoft.Owin.Host.SystemWeb.dll中,但未在用户代码中处理
在下面的代码。
public class UserClaimsPrincipalFactory : ClaimsPrincipalFactory
{
protected override ClaimsPrincipal OnGetClaimsPrincipal()
{
return HttpContext.Current.GetOwinContext().Authentication.User;
}
}冒充我试过
Mock<UserClaimsPrincipalFactory> mockUserClaimsPrincipal = new Mock<UserClaimsPrincipalFactory>();
mockUserClaimsPrincipal
.Setup(ucp => ucp.GetClaimsPrincipal().Identity).Returns("Need to set");有人帮我做这件事。提前谢谢。
发布于 2016-04-20 12:03:04
如果下面的代码..。
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as ClaimsIdentity;作为更大的测试的一部分,您需要claimIdentity变量,然后需要抽象UserClaimsPrincipalFactory,因为这个类的具体实现与HttpContext紧密耦合在一起,除非您还模拟了HttpContext (您不应该这么做:不要嘲笑HttpContext:他不喜欢被嘲笑!),否则它在测试期间是空的。
如果最终目标是获得一个ClaimsPrincipal/ClaimsIdentity,那么您就可以将该需求抽象到服务中。
public interface IClaimsPrincipalFactory {
ClaimsPrincipal GetClaimsPrincipal();
}这样,您就可以在不依赖HttpContext的情况下进行测试。
这里的假设是,您可以直接控制ClaimsPrincipalFactory类并可以重构它.
public abstract class ClaimsPrincipalFactory : IClaimsPrincipalFactory {
public ClaimsPrincipal GetClaimsPrincipal() {
ClaimsPrincipal result = OnGetClaimsPrincipal();
//...other code
return result;
}
protected abstract ClaimsPrincipal OnGetClaimsPrincipal();
}这样做了,单元测试看起来就像.
[TestMethod]
public void Factory_Should_Get_Claims_Principal() {
//Arrange
var fakeIdentity = new ClaimsIdentity();
var mockUserClaimsPrincipal = new Mock<IClaimsPrincipalFactory>();
mockUserClaimsPrincipal.Setup(ucp => ucp.GetClaimsPrincipal().Identity).Returns(fakeIdentity);
IClaimsPrincipalFactory userClaimsPrincipal = mockUserClaimsPrincipal.Object;
System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;
//Act
//...other code that uses the claimIdentity
//Assert
//...other assertions
}发布于 2016-04-25 11:28:16
你可以用悬挂式隔离器来做。Isolate.WhenCalled()模拟OnGetClaimsPrincipal(),因此它根本不碰HttpContext,并返回所需的ClaimsPrincipal。参见示例:
public void TestGetClaimsPrincipal()
{
//Arrange
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "Name"));
claims.Add(new Claim(ClaimTypes.Email, "name@gmail.com"));
var myIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var myPrincipal = new ClaimsPrincipal(myIdentity);
var target = new UserClaimsPrincipalFactory();
Isolate.NonPublic.WhenCalled(target, "GetClaimsPrincipal").WillReturn(myPrincipal);
//Act
var result = Isolate.Invoke.Method(target, "GetClaimsPrincipal") as ClaimsPrincipal;
//Assert
Assert.AreEqual("Name", result.Identity.Name);
}希望能帮上忙!
https://stackoverflow.com/questions/36735329
复制相似问题