如何测试Web API 2控制器中的“Patch”操作?

时间:2015-01-21 03:15:47

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

我有一个基本的测试用例,它将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不能为null。

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

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

productController.Configuration = new HttpConfiguration();

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

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

1 个答案:

答案 0 :(得分: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中prearrangedchaos的信息(这表明这是一个MVC4解决方案,可能存在更好的WebApi2解决方案。)

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