模拟接口的特定类实例

时间:2018-05-23 08:22:44

标签: c# .net unit-testing mocking nsubstitute

我正试图嘲笑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。虽然我问的是一个与此问题相关的具体问题,但我更常见的问题是:是否有任何技术可以在界面模拟中模拟接口的特定类实例?

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

1 个答案:

答案 0 :(得分:1)

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

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