我正试图嘲笑System.Security.Principal.IIdentity
。但是,我特别想在测试期间替换特定的Claim
。我遇到的问题是,虽然我可以模拟并替换接口的元素,但在解析并转换为方法之前,我无权访问该类。
这是我的Controller构造函数:
public MyController(IIdentity identity)
{
_userIdentity = identity as ClaimsIdentity;
这是我的代码,我试图模仿声明:
var mockClaim = new Claim("test", "test");
IIdentity identity = Substitute.For<IIdentity>();
((ClaimsIdentity)identity).Claims.Returns(new List<Claim>() { mockClaim });
显然,这不起作用,因为identity
在这种情况下实际上不是一个IIdentity。虽然我问的是一个与此问题相关的具体问题,但我更常见的问题是:是否有任何技术可以在界面模拟中模拟接口的特定类实例?
(我意识到我可以简单地将这一切包装在我自己的界面和包装类中 - 但这感觉就像是矫枉过正)。
答案 0 :(得分:1)
在这种情况下,你需要模仿ClaimsIdentity
,而不是IIdentity
。当然,你可以将结果模拟传递给控制器,因为ClaimsIdentity
实现了IIdentity
:
var identity = Substitute.For<ClaimsIdentity>();
identity.Claims.Returns(new List<Claim>() { mockClaim });
var controller = new MyController(identity);
// ...