单元测试 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

要模拟 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

相关文章:
  • 没有找到相关文章