单元测试WebRequest.在库中创建Http



我的场景是这样的——我在接口(IRestSupport)后面有一个具体的类(RestSupport),它有两个核心方法:CreateRequest和GetResponse。这个类的设计目的是允许我通过JSON与web端点进行对话。该类由另一个具有更高级别业务逻辑的类调用,以提供需要发送的确切JSON。

我需要能够对这两个方法进行单元测试,这样它们就不会在测试过程中调用端点。CreateRequest依赖于HttpWebRequest,因为我需要向Headers集合添加信息。这里有更多的代码,但下面给你一个例子。

var request = WebRequest.Create(url) as HttpWebRequest;
request.Headers.Add("Authorization", AuthorizationHeader);

我在网上看到了许多使用IWebRequestCreate的例子,这样你就可以控制请求的创建。我遇到的问题是,在使用HttpWebRequest时,我似乎无法使其正常工作。IWebRequestCreate的Create方法期望您返回一个WebRequest对象。web示例的缺点是它们没有使用HttpWebRequest。我无法从HttpWebRequest派生类,这确实是我问题的症结所在。

我不能接触假货,但可以使用Moq。如果可以避免的话,我的目标是不修改库代码。

我想您谈论的是内存中的单元测试。最简单的方法是在另一个实现接口的类中"隐藏"这两行。现在您可以模拟接口了。你只有这两行字,这听起来很奇怪。。。我想你们班上还有更多不可测试的东西。我的建议是将您想要测试的所有逻辑与一些不值得测试的"基础设施"细节分开。

我昨天也遇到了同样的问题,我就是这样解决的。

包含WebRequest的类在构造函数中使用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);
}
}

在我的测试中,我创建了一个mock,其中包含我需要覆盖的函数:

void TestSetupMocks()
{
var request = new TestWebRequest();
Mock<IWebRequestCreate> _webClientFactory;
_webClientFactory.Setup(x => x.Create(uri)).Returns(request);
}
class TestWebRequest : WebRequest
{
// Implement abstract functions
}

相关内容

  • 没有找到相关文章

最新更新