我正在使用MS测试单元测试我的Web控制器。
下面是具有返回类型的Web方法:
public IHttpActionResult MethodName(){ //Code logic
return Ok(new { Data = result, Total = (result.Count() > 0 ? result.First().TotalCount : 0) });
}
在上面的代码片段中:
IEnumerable
类型
为了测试上面的API方法,下面的返回类型是我尝试过的:
[TestMethod]
public void TestMethodName(){
var result = controller.MethodName();
//Below line is having issue and thus the contentResult is null
var contentResult = result as OkNegotiatedContentResult<List<ViewModelName>>;
}
将Int添加到OkNegotiatedContentResult抛出错误,因为它只例外于单个参数
下面是API的实际返回类型:
{System.Web.Http.Results.OkNegotiatedContentResult<<>f__AnonymousType0,int>>}
我应该如何转换结果,使我可以使用它的内容为断言?
提前谢谢你。代码示例不胜感激。
发布于 2021-09-28 09:45:55
您遇到的问题是,您的OkNegotiatedContentResult<T>
具有T
的匿名类型。当您像使用new { Date = .., Total =.. }
一样创建一个特殊类型时,编译器会为您生成一个匿名类型。通过设计,匿名类型有一个您永远不能在C#代码中使用的名称,但它仅在编译的JIT代码中有效。
这就是为什么将结果转换为OkNegotiatedContentResult<List<ViewModelName>>
的原因,因为T
不是List<ViewModelName>
,而是anonymoustype<System.Collections.Generic.List<ViewModel'>, int>>
。
在我的观点中,最好的选择不是使用匿名类型,而是创建一个具有您要查找的两个属性的实际类,并在控制器和测试中使用该类型。
public class MyData
{
public List<ViewModel> Data { get; set; }
public int Total { get; set; }
}
如果不想更改代码,可以使用反射或动态关键字,如下所示:
dynamic contentResult = (dynamic)result.Content;
var data = contentResult.Data
发布于 2021-09-28 11:35:29
这是一个解决方案,乍一看可能有点麻烦。
所以,首先要确保我们收到了一个OkNegotiatedContentResult
//Act
var actionResult = controller.MethodName();
//Assert - OkNegotiated result
var resultType = actionResult.GetType().GetGenericTypeDefinition();
Assert.AreEqual(resultType.GetGenericTypeDefinition(), typeof(OkNegotiatedContentResult<>));
然后确保匿名类型定义了Data
属性
免责声明:以下代码在运行时无法检索Content
//Assert - Anonymous type
dynamic content = ((dynamic)actionResult).Content;
Assert.IsTrue(content.GetType().GetProperty("Data") != null);
并确保Data
属性是一个集合。
//Assert - Data property
Assert.IsInstanceOfType(content.Data, typeof(IEnumerable<ViewModelName>));
var data = (IEnumerable<ViewModelName>)content.Data;
https://stackoverflow.com/questions/69359128
复制相似问题