【问题标题】:Mocking a specific class instance of an interface模拟接口的特定类实例
【发布时间】:2018-11-02 03:29:36
【问题描述】:

我正在尝试模拟 System.Security.Principal.IIdentity。但是,我特别想在测试期间替换特定的Claim。我遇到的问题是,虽然我可以模拟和替换接口的元素,但我无法访问该类,直到它被解决并在方法中强制转换。

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

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。虽然我问的是与此问题相关的特定问题,但我更一般的问题是:是否有任何技术可以在接口模拟中模拟接口的特定类实例?

(我意识到我可以简单地将这一切包装在我自己的接口和包装类中——但这感觉有点矫枉过正)。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多