我正在尝试模拟 System.Security.Principal.IIdentity
。但是,我特别想在测试期间替换特定的 Claim
。我遇到的问题是,虽然我可以模拟和替换接口(interface)的元素,但我无法访问该类,直到它被解析并在方法中强制转换。
这是我的 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。虽然我问的是与此问题相关的具体问题,但我更一般的问题是:是否有任何技术可以在接口(interface)模拟中模拟接口(interface)的特定类实例?
(我意识到我可以简单地将这一切包装在我自己的界面和包装器类中 - 但这感觉有点过分了)。
最佳答案
在这种情况下,您需要模拟 ClaimsIdentity
,而不是 IIdentity
。当然,您可以将模拟结果传递给 Controller ,因为 ClaimsIdentity
实现了 IIdentity
:
var identity = Substitute.For<ClaimsIdentity>();
identity.Claims.Returns(new List<Claim>() { mockClaim });
var controller = new MyController(identity);
// ...
关于c# - 模拟接口(interface)的特定类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50483327/