我无法找到以下代码行的模拟。
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
System.Security.Claims.ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as System.Security.Claims.ClaimsIdentity;
当我尝试模拟时,我收到错误
Microsoft.Owin.Host.SystemWeb.dll中发生了'System.NullReferenceException'类型的异常,但未在用户代码中处理
在下面的代码中。
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");
任何人都可以帮助我。提前谢谢。
答案 0 :(得分:1)
以下代码......
ClaimsPrincipalFactory userClaimsPrincipal = new UserClaimsPrincipalFactory();
ClaimsIdentity claimIdentity = userClaimsPrincipal.GetClaimsPrincipal().Identity as ClaimsIdentity;
正在用作需要claimIdentity
变量的大型测试的一部分,然后您需要抽象UserClaimsPrincipalFactory
,因为此类的具体实现与{{1}紧密耦合除非你还嘲笑HttpContext
(你不应该这样做:Don't mock HttpContext: He doesn't like to be mocked!)
如果最终目标是获得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();
}
答案 1 :(得分:1)
您可以使用Typemock Isolator执行此操作。
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);
}
希望它有所帮助!