c# - 最小起订量 HttpWebRequest 对象

标签 c# mocking moq

我想尝试 Moq 来模拟一个请求对象,以在我的测试用例中模拟诸如网络故障之类的事情。我的第一次尝试是:

        var mock = new Mock<WebRequest>();
        mock.Setup(m => m.GetResponse()).Throws<WebException>();
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        //trying to get this to throw a web exception
        request.GetResponse();

这行不通,所以我正在寻找执行此操作的正确方法。

谢谢

编辑:正如评论中指出的那样,我想使用 WebRequest.Create(它实际上是另一种方法,但我已针对示例进行了简化)。

最佳答案

静态方法和工厂(如 WebRequest.Create)是单元测试的痛点。有些这样的工厂方法允许拦截/自定义结果,有些则不允许。

最直接的解决方案是拥有您的代码所依赖的自己的工厂方法(最好是接口(interface)形式)。

在某些情况下,您可以将已创建的对象传递给被测代码,而不是让代码创建自己的对象。

WebRequest.Create 的特殊情况下,您可以通过 WebRequest.RegisterPrefix 提供自己的工厂。 .查看说明,您将需要使用其他一些自定义 Uri 方案,因为“http”/“https”已经注册并且不允许重复注册(我也从未尝试过这种方法)。

这是一个示例代码,它为控制台应用程序中的“http://”方案提供自定义创建者。如果其他东西已经使用 WebRequest 注册了 http 方案,此代码可能会失败:

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...
            }
        }
    }
}

关于c# - 最小起订量 HttpWebRequest 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15193495/

相关文章:

c# - Web API - 上传到 Azure 存储时获取进度

entity-framework - 如何构建工作单元/服务层/存储库,以便它们与 DI (Unity) 和 Moq 一起进行单元测试

c# - 模拟 Guid.NewGuid()

c# - 使用 List<int> 作为参数模拟一个方法,并使用 Moq 返回 List<>

c# - Moq.CaSTLeProxyFactory' 无法加载文件或程序集 'CaSTLe.Core

c# - 如何将 ironpython 控制台插入到我的表单中?

c# - 是否有类似 boost::asio for .NET (Mono) 的东西?

c# - simpleinjector 3.0 不支持 RegisterManyForOpenGeneric

typescript - 如何模拟 ServiceBusError 异常以进行 Jest 测试?

java - java中如何结合mock和DI?