c# - 模拟接口(interface)的特定类实例

标签 c# .net unit-testing mocking nsubstitute

我正在尝试模拟 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/

相关文章:

c# - 在 Umbraco 中对用户隐藏内容选项卡

amazon-web-services - 是否可以在不更改参数的情况下对使用 AWS SDK 的 Go 函数进行单元测试?

python - 在unittest中使用assertRaises引发但未捕获的自定义异常

c# - 检查任何下游数据 block

c# - 您可以更改类型化数据集提供程序吗?

c# - 按下按钮并成功重定向到另一个页面后,如何禁用导航栏链接?

wpf - 使用 StaticResources 测试 WPF 窗口

c# - HttpRequestHeader 内容编码问题

c# - CSP 未在远程桌面上检测到智能卡微型驱动程序

c# - 打开带有预先确定的 cookie 集的网页