c# - 使用 .Net WebRequest 工厂

标签 c# unit-testing webrequest

正如 Richard Willis 在 http://blog.salamandersoft.co.uk/index.php/2009/10/how-to-mock-httpwebrequest-when-unit-testing/ 中建议的那样我正在尝试调用网络请求来激发行为。

为此(我问我是不是在这里搞砸了)我实现了一个 IWebRequestCreate 并扩展了一个 WebRequest 和一个 WebResponse。 (链接代码中有更多详细信息)

但现在在我的代码中我有一个注册 (WebRequest.RegisterPrefix) 前缀的测试:

[Test]
public void Test() {
     var some = File.ReadAllBytes(@"TestData\WebService\admrond_13jan2011_14jan2011.xml");
     WebRequest.RegisterPrefix("mockPrefix", new WebRequestCreateMock());
     WebRequestFake request = WebRequestCreateMock.CreateRequestFake(some);

     _remoteRepository.PopulateWithMeterData(_meter);
     ... (error in line before)

然后,我收到此错误:无效的 URI:无法解析主机名。

但是为什么?在我的 PopulateWithMeterData(Meter meter) 我有这个电话:

     WebRequest request = WebRequest.Create(urlListMeteringData);
     WebResponse ws = request.GetResponse();

一些建议?发布我的类实现是否有趣?


编辑:正如@Matthew 所问:

public class WebRequestCreateMock : IWebRequestCreate {

    static WebRequest _nextRequest;
    static readonly object LockObject = new object();

    static public WebRequest NextRequest {
        get { return _nextRequest; }
        set {
            lock (LockObject) {
                _nextRequest = value;
            }
        }
    }

    public WebRequest Create(Uri uri) {
        return _nextRequest;
    }

    public static WebRequestFake CreateRequestFake(byte[] xmlStream) {
        WebRequestFake webRequestFake = new WebRequestFake(xmlStream);
        NextRequest = webRequestFake;
        return webRequestFake;
    }

}

public class WebRequestFake : WebRequest {
    MemoryStream requestStream = new MemoryStream();
    MemoryStream responseStream;

    public override string Method { get; set; }
    public override string ContentType { get; set; }
    public override long ContentLength { get; set; }

    public WebRequestFake(byte[] response) {
        responseStream = new MemoryStream(response);
    }

    public override Stream GetRequestStream() {
        return requestStream;
    }

    public override WebResponse GetResponse() {
        return new WebReponseFake(responseStream);
    }
}

public class WebReponseFake : WebResponse {

    private readonly Stream _responseStream;

    public WebReponseFake(Stream responseStream) {
        _responseStream = responseStream;
    }

    public override Stream GetResponseStream() {
        return _responseStream;
    }
}

Url 类似于:mockPrefix://NoMatterUrl

最佳答案

因为错误是“无效的 URI:无法解析主机名。”你可能搞砸了你的 Uri "mockPrefix://NoMatterUrl"

我曾经遇到过这个问题,因为我忘记在域uri和请求参数之间添加“/”。

你能发布你的“NoMatterUri”到底是什么样子的吗?

关于c# - 使用 .Net WebRequest 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5033781/

相关文章:

c# - 使用 WebClient 或 WebRequest 登录网站并访问数据

c# - 从 WebResponse 类读取时数据过早结束

c# - WebRequest 不会使缓存项在同一进程中可用

c# - ASP.NET 表单值验证场景

c# - SmtpClient - 发送到不同的域

java - 在 VS Code 中哪里设置 JUnit 的 vmArgs?

javascript - 单元测试 Mootools 代码的最佳解决方案

c# - 为什么我的 C# Xml 代码仅在枚举变量 enumerable 时才起作用

javascript - asp.net web api 405方法不允许,发布,自定义操作

linq - 墨清 Entity Framework 6.Include()使用DbSet<>