我有一个基本的测试用例,它将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”或其中一个依赖项。系统找不到指定的文件。
答案 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