正如 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/