【问题标题】:moq HttpWebRequest object最小起订量 HttpWebRequest 对象
【发布时间】:2013-03-04 02:10:04
【问题描述】:

我想尝试 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();

这不起作用,所以我正在寻找正确的方法来做到这一点。

谢谢

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

【问题讨论】:

  • 您的示例看起来很奇怪 - 您设置了一个对象,但希望在完全不同的对象上获得异常。 mock.Object.GetResponse() 有什么问题?或者您正在尝试实际拦截 WebRequst.Create 静态工厂方法的执行?
  • @AlexeiLevenkov 是绝对正确的,我建议这将是一个正确的答案。
  • @OferZelig,虽然它可能没问题,但我强烈怀疑directedbit 是否想要 - 我怀疑被测代码实际上使用 Create 而不是依赖传入的请求对象(或自定义可模拟工厂) - 所以不太可能有帮助。等待 OP 评论。
  • @Alexi 代码实际上是在另一种方法中调用的(我简化了它)所以我想这意味着我必须将它作为参数传递。在我使用过的其他语言(例如 ruby​​)中,您可以重新定义方法调用,以便新实例调用存根,我会假设这种行为。

标签: c# mocking moq


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2017-03-21
    • 1970-01-01
    • 2022-01-16
    • 2012-08-09
    相关资源
    最近更新 更多