[英]Difference between WebRequest.Create and WebRequest.CreateHttp
[英]Unit testing WebRequest.CreateHttp within a library
我的情况是这样的 - 我在接口(IRestSupport)后面有一个具体的类(RestSupport),它有两个核心方法:CreateRequest和GetResponse。 此类旨在允许我通过JSON与Web端点进行通信。 此类由另一个具有更高级别业务逻辑的类调用,以提供需要发送的确切JSON。
我需要能够对这两种方法进行单元测试,以便它们在测试期间不会调用端点。 CreateRequest依赖于HttpWebRequest,因为我需要向Headers集合添加信息。 代码多于此,但下面给出了一个示例。
var request = WebRequest.Create(url) as HttpWebRequest;
request.Headers.Add("Authorization", AuthorizationHeader);
我在Web上看到许多使用IWebRequestCreate的示例,以便您可以控制请求创建。 我遇到的问题是,在使用HttpWebRequest时,我似乎无法正常工作。 IWebRequestCreate的Create方法期望您将返回WebRequest对象。 Web示例的缺点是它们没有使用HttpWebRequest。 我无法从HttpWebRequest派生出一个类,这实际上是我问题的症结所在。
我无法获得假货,但可以使用Moq。 我的目标是在可以避免的情况下不修改库代码。
我想你在谈论内存中的单元测试。 最简单的方法是在另一个实现接口的类中“隐藏”这两行。 现在你可以模拟界面了。 我觉得你只有那两行......我觉得你班上还有更多不可测试的东西。 我的建议是将您要测试的所有逻辑分离为一些不值得测试的“基础架构”细节。
昨天我遇到了完全相同的问题,这就是我修复它的方法。
包含WebRequest
的IWebRequestCreate
在构造函数中使用IWebRequestCreate
。
class MyClass
{
IWebRequestCreate _web;
public MyClass(IWebRequestCreate web)
{
_web = web;
}
public void Download(string url)
{
var request = _web.Create(url);
}
}
在应用程序中,我使用IoC容器注册我的类:
class MyWebRequest : IWebRequestCreate
{
public WebRequest Create(Uri uri)
{
return WebRequest.Create(uri);
}
}
在我的测试中,我创建了一个模拟我需要覆盖的函数:
void TestSetupMocks()
{
var request = new TestWebRequest();
Mock<IWebRequestCreate> _webClientFactory;
_webClientFactory.Setup(x => x.Create(uri)).Returns(request);
}
class TestWebRequest : WebRequest
{
// Implement abstract functions
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.