静态方法和工厂(如WebRequest.Create
)对于单元测试来说很痛苦。一些这样的工厂方法允许拦截/自定义结果,有些则不允许。
最直接的解决方案是拥有自己的代码将依赖的工厂方法(最好以接口的形式)。
在某些情况下,您可以将已创建的对象传递给您的测试代码,而不是让代码创建自己的。
在特定情况下,WebRequest.Create
您可以通过WebRequest.RegisterPrefix提供您自己的工厂。查看描述,您将需要使用其他一些自定义 Uri 方案,因为“http”/“https”已经注册并且不允许重复注册(我也从未尝试过这种方法)。
这是一个示例代码,它为控制台应用程序中的“http://”方案提供自定义创建者。如果其他东西已经注册了 http 方案,则此代码可能会失败WebRequest
:
using System;
using System.Net;
namespace CustomWebRequest
{
class Program
{
static void Main(string[] args)
{
var success = WebRequest.RegisterPrefix("http://", new CustomRequestCreator());
Console.Write("Handler registered:{0}", success);
var request = WebRequest.Create(new Uri("http://home.com"));
}
class CustomRequestCreator : IWebRequestCreate
{
public WebRequest Create(Uri uri)
{
Console.WriteLine("Custom creator");
return null; // return your mock here...
}
}
}
}