C# 在库中对WebRequest.CreateHttp进行单元测试
我的场景是这样的——我在接口(IRestSupport)后面有一个具体的类(RestSupport),该接口有两个核心方法:CreateRequest和GetResponse。这个类允许我通过JSON与web端点对话。该类由另一个具有更高级别业务逻辑的类调用,以提供需要发送的确切JSON 我需要能够对这两个方法进行单元测试,以便它们在测试期间不调用端点。CreateRequest依赖于HttpWebRequest,因为我需要向Headers集合添加信息。还有更多的代码,但下面给出了一个示例C# 在库中对WebRequest.CreateHttp进行单元测试,c#,httpwebrequest,C#,Httpwebrequest,我的场景是这样的——我在接口(IRestSupport)后面有一个具体的类(RestSupport),该接口有两个核心方法:CreateRequest和GetResponse。这个类允许我通过JSON与web端点对话。该类由另一个具有更高级别业务逻辑的类调用,以提供需要发送的确切JSON 我需要能够对这两个方法进行单元测试,以便它们在测试期间不调用端点。CreateRequest依赖于HttpWebRequest,因为我需要向Headers集合添加信息。还有更多的代码,但下面给出了一个示例 va
var request = WebRequest.Create(url) as HttpWebRequest;
request.Headers.Add("Authorization", AuthorizationHeader);
我在网上看到了许多使用IWebRequestCreate的示例,这样您就可以控制请求的创建。我遇到的问题是,在使用HttpWebRequest时,我似乎无法使其正常工作。IWebRequestCreate的Create方法要求您返回WebRequest对象。web示例的缺点是它们没有使用HttpWebRequest。我无法从HttpWebRequest派生类,这是我问题的症结所在
我没有获得假货,但可以使用最低起订量。如果可以避免的话,我的目标是不修改库代码。我想你说的是内存中的单元测试。
最简单的方法是在实现接口的另一个类中“隐藏”这两行。现在可以模拟接口了。这听起来很奇怪,你只有这两行。。。我想你们班上还有更多不可测试的东西。我的建议是将要测试的所有逻辑与一些不值得测试的“基础设施”细节分开 我想你说的是内存中的单元测试。
最简单的方法是在实现接口的另一个类中“隐藏”这两行。现在可以模拟接口了。这听起来很奇怪,你只有这两行。。。我想你们班上还有更多不可测试的东西。我的建议是将要测试的所有逻辑与一些不值得测试的“基础设施”细节分开 我昨天遇到了完全相同的问题,我就是这样解决的 包含
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);
}
}
在测试中,我创建了一个模拟,其中包含需要覆盖的函数:
void TestSetupMocks()
{
var request = new TestWebRequest();
Mock<IWebRequestCreate> _webClientFactory;
_webClientFactory.Setup(x => x.Create(uri)).Returns(request);
}
class TestWebRequest : WebRequest
{
// Implement abstract functions
}
void TestSetupMocks()
{
var request=newtestwebrequest();
模拟网络客户端工厂;
_webClientFactory.Setup(x=>x.Create(uri)).Returns(request);
}
类TestWebRequest:WebRequest
{
//实现抽象函数
}
我昨天遇到了完全相同的问题,我就是这样解决的
包含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);
}
}
在测试中,我创建了一个模拟,其中包含需要覆盖的函数:
void TestSetupMocks()
{
var request = new TestWebRequest();
Mock<IWebRequestCreate> _webClientFactory;
_webClientFactory.Setup(x => x.Create(uri)).Returns(request);
}
class TestWebRequest : WebRequest
{
// Implement abstract functions
}
void TestSetupMocks()
{
var request=newtestwebrequest();
模拟网络客户端工厂;
_webClientFactory.Setup(x=>x.Create(uri)).Returns(request);
}
类TestWebRequest:WebRequest
{
//实现抽象函数
}