模拟接口的特定 class 实例

Mocking a specific class instance of an interface

我正在尝试模拟 System.Security.Principal.IIdentity。但是,我特别想在测试期间替换特定的 Claim 。我遇到的问题是,虽然我可以模拟和替换界面的元素,但我无法访问 class 直到它被解析并在方法中进行转换。

这是我的控制器构造函数:

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。尽管我问的是与此问题相关的具体问题,但我更普遍的问题是:是否有任何技术可以在接口模拟中模拟接口的特定 class 实例?

(我意识到我可以简单地将这一切包装在我自己的界面和包装器中 class - 但感觉有点矫枉过正)。

在这种情况下,您需要模拟 ClaimsIdentity,而不是 IIdentity。当然,您可以将模拟结果传递给控制器​​,因为 ClaimsIdentity 实现了 IIdentity:

var identity = Substitute.For<ClaimsIdentity>();
identity.Claims.Returns(new List<Claim>() { mockClaim });
var controller = new MyController(identity);
// ...