单元测试OpenIdRelyingParty

时间:2012-05-23 15:01:02

标签: c# asp.net-mvc-3 dependency-injection openid dotnetopenauth

如果这是一个重复的问题,我道歉(我没有找到类似的东西)。 我正在尝试构建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?

3 个答案:

答案 0 :(得分:1)

我会,因为你已经这样做了,所以在你的配置服务中注入OpenIdRelyingParty到你的构造函数中。

除此之外,您可以在单元测试中模拟HttpContext。 HttpContext.Current有一个setter,因此将其设置为mock / stub 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
}

这对我来说会有点代码味道。它正在测试依赖关系的依赖关系(或者远不及兔子洞)。虽然重构不是一种选择,但它很有用。

答案 1 :(得分:1)

要为OpenIdRelyingParty模拟HttpContext,您应该修改该类的代码。即使你会浪费一些时间来嘲笑它,因为它是一个密封的类(但你不能用MOCKWCF)。

我认为最好为 OpenIdRelyingParty 制作包装器或适配器。像:

public class OpenIdRelyingPartyWrapped
{
    private OpenIdRelyingParty openIdRelyingPartyTarget;
    ....
    public virtual IAuthenticationRequest CreateRequest(string text)
    {
        return this.openIdRelyingPartyTarget.CreateRequest(text);
    }
    ...
} 

然后你就可以随意嘲笑它。

答案 2 :(得分:1)

OpenIdRelyingParty可以在单元测试中使用接受HttpRequestBase的方法重载,这是完全可模拟的。只有不将其作为参数的方法才需要HttpContext.Current