C# 使用.NETWebRequestFactory

C# 使用.NETWebRequestFactory,c#,unit-testing,webrequest,C#,Unit Testing,Webrequest,正如Richard Willis在文章中所建议的那样,我试图将网络请求称为吸烟行为 为此(我问我这里是否搞乱了什么),我实现了一个IWebRequestCreate并扩展了一个WebRequest和一个WebResponse。(链接代码中有更多详细信息) 但是现在在我的代码中有一个测试,它注册了一个前缀(WebRequest.RegisterPrefix): [Test] public void Test() { var some = File.ReadAllBytes(@"TestD

正如Richard Willis在文章中所建议的那样,我试图将网络请求称为吸烟行为

为此(我问我这里是否搞乱了什么),我实现了一个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:无法解析主机名。

但是为什么呢?在my
PopulateWithMeterData(Meter-Meter)
中,我有一个电话:

     WebRequest request = WebRequest.Create(urlListMeteringData);
     WebResponse ws = request.GetResponse();
有什么建议吗?我的类后实现有趣吗


编辑:如@Matthew ask:

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搞砸了“mockP”refix://NoMatterUrl"

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


你能准确地发布你的“NoMatterUri”是什么样子吗?

我发现有必要在前缀中添加一个尾随“/”。例如,“
test://localhost/
“:


我将进一步充实您的代码,并给出一个用于创建请求的url示例。@Custodio我想使用rtmp链接将其传递给HttpHander for vlc插件视频目标源。你能帮助我如何使用你的代码阅读实时流到vlc插件播放器完美!我弄乱了url,调试了我得到的:
mockPrefix://NoMatterUrlADM_ROND&datainicio=20090101000000&datafim=20090102000000
。所以我在NoMatterUrl之后加了一个“/”,一切正常!
WebRequest.RegisterPrefix("mockPrefix:", new WebRequestCreateMock());
[TestClass]
public class WebRequestTests
{
    [TestMethod]
    public void TestWebRequestCreate()
    {
        const string uriString = "test://localhost/foo/bar.baz?a=b&c=d";
        var webRequest = new MockWebRequestCreateAssertUrl(uriString);
        Assert.IsTrue(WebRequest.RegisterPrefix("test://localhost/", webRequest),
                      "Failed to register prefix");
        Assert.IsNotNull(WebRequest.Create(uriString));
    }

    public class MockWebRequestCreateAssertUrl : IWebRequestCreate
    {
        private readonly Uri _expectedUri;

        public MockWebRequestCreateAssertUrl(string uriString)
        {
            _expectedUri = new Uri(uriString);
        }

        public WebRequest Create(Uri uri)
        {
            Assert.AreEqual(_expectedUri, uri, "uri parameter is wrong");
            return new MockWebRequestAssertUrl();
        }
    }

    public class MockWebRequestAssertUrl : WebRequest {}
}