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