【问题标题】:How do you test the 'Patch' action in Web API 2 controllers?您如何测试 Web API 2 控制器中的“补丁”操作?
【发布时间】:2015-03-19 11:45:07
【问题描述】:

我有一个基本的测试用例,它将一个 Delta 对象放在一起,以传递给我能够成功完成的控制器的“PATCH”操作。我的测试代码如下

[TestMethod]
    public async Task Patch_Product()
    {
        // Act
        var delta = new Delta<Product>(typeof(Product));
        delta.TrySetPropertyValue("Name", "PatchedProduct");
        delta.TrySetPropertyValue("Comment", "A test Product that has been patched");

        var result = await productController.Patch(1, delta);

        // Assert
        Assert.IsNotNull(result);
    }

当代码到达 Patch 动作的第一行时,如下所示

Validate(patch.GetEntity());

失败并出现以下异常:System.InvalidOperationException: ApiController.Configuration must not be null.

我验证了 ApiController.Configuration 对于我的所有其他测试以及 GET、POST、DELETE 等实际上都为空。但是,这些控制器操作都没有调用此异常所在的“Validate()”方法抛出。有没有人遇到过这个?有没有办法通过潜在地模拟上下文来针对 PATCH 工作进行测试?

我尝试在测试中也传入一个空白配置,如下所示:

productController.Configuration = new HttpConfiguration();

但这似乎也不起作用。我得到了这个例外:

System.IO.FileNotFoundException:无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。系统找不到指定的文件。

【问题讨论】:

    标签: asp.net-mvc unit-testing controller asp.net-web-api2 patch


    【解决方案1】:

    以下内容在 MVC5 WebApi2 项目中为我工作:

    //----- Test the patch
    XXXController controller = new XXXController();
    HttpConfiguration configuration = new HttpConfiguration();
    HttpRequestMessage request = new HttpRequestMessage();
    controller.Request = request;
    controller.Request.Properties["MS_HttpConfiguration"] = configuration;
    
    Delta<Shipment> patch = new Delta<XXEntity>();
    patch.TrySetPropertyValue("Id", xx.Id);
    patch.TrySetPropertyValue("Notes", "Test Comment");
    
    controller.Patch(xx.Id, patch);
    

    这是基于来自https://aspnetwebstack.codeplex.com/discussions/358709 中预先安排的混乱的信息(这表明这是一个 MVC4 解决方案,并且可能存在更好的 WebApi2 解决方案)。

    在寻找我的解决方案时,我还发现了一个相关问题,如果您对 Url 有问题(我没有),这可能会很有用:Unit Test with route data not working on ASP.NET MVC 5 Web API

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多