模拟接口的特定 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);
// ...
我正在尝试模拟 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);
// ...