单元测试 OpenIdRelyingParty
本文关键字:OpenIdRelyingParty 单元测试 | 更新日期: 2023-09-27 18:35:02
如果这是一个重复的问题,我深表歉意(我没有找到类似的东西(。我正在尝试构建OpenId身份验证服务并对其进行单元测试,目前我有以下设置:
public class OpenIdAuthenticationService : IAuthenticationService
{
private IConfigurationService _configService;
private OpenIdRelyingParty _openIdRelyingParty;
public OpenIdAuthenticationService(IConfigurationService configService)
{
_configService = configService;
_openIdRelyingParty = new OpenIdRelyingParty();
}
}
显然OpenIdRelyingParty需要访问HttpContext,有没有办法模拟OpenIdRelyingParty并为其注入服务?或者也许模拟HttpContext并以某种方式将其提供给OpenIdRelyingParty?
要模拟 OpenIdRelyingParty 的 HttpContext,您应该修改该类的代码。即使你会浪费一些时间来嘲笑它,因为它是一个密封的类(但并非不可能,你可以使用 MOCKWCF(。
我认为最好为OpenIdRelyingParty制作一个包装器或适配器。 比如:
public class OpenIdRelyingPartyWrapped
{
private OpenIdRelyingParty openIdRelyingPartyTarget;
....
public virtual IAuthenticationRequest CreateRequest(string text)
{
return this.openIdRelyingPartyTarget.CreateRequest(text);
}
...
}
然后,您将能够根据需要模拟它。
既然您已经在这样做,我会像使用配置服务一样将OpenIdRelyingParty
注入到构造函数中。
除此之外,你可以在单元测试中模拟 HttpContext。 HttpContext.Current
有一个二传手,所以把它设置为模拟/存根HttpContextBase
。下面是一个将 NSubstitute 与 NUnit 结合使用的示例:
[TearDown]
public void CleanUp()
{
HttpContext.Current = null;
}
[Test]
public void FakeHttpContext()
{
var context = Substitute.For<HttpContextBase>();
var request = Substitute.For<HttpRequestBase>();
context.Request.Returns(request);
//Do any more arragement that you need.
//Act
//Assert
}
不过,这对我来说会有点代码味。它正在测试依赖关系的依赖关系(或者不管兔子洞有多远(。不过,当重构不是一种选择时,它很有用。
OpenIdRelyingParty
可以在单元测试中使用接受HttpRequestBase
的方法重载,这是完全可以模拟的。 只有不将其作为参数的方法才需要HttpContext.Current
。