首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有匿名类型的IHttpActionResult的OkNegotiatedContentResult单元测试

具有匿名类型的IHttpActionResult的OkNegotiatedContentResult单元测试
EN

Stack Overflow用户
提问于 2021-09-28 09:28:04
回答 2查看 562关注 0票数 1

我正在使用MS测试单元测试我的Web控制器。

下面是具有返回类型的Web方法:

代码语言:javascript
运行
复制
public IHttpActionResult MethodName(){ //Code logic 
    return Ok(new { Data = result, Total = (result.Count() > 0 ? result.First().TotalCount : 0) });
}

在上面的代码片段中:

IEnumerable

  • Total
  1. 数据类型为Int

类型

为了测试上面的API方法,下面的返回类型是我尝试过的:

代码语言:javascript
运行
复制
[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>>}

我应该如何转换结果,使我可以使用它的内容为断言?

提前谢谢你。代码示例不胜感激。

EN

回答 2

Stack Overflow用户

发布于 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>>

在我的观点中,最好的选择不是使用匿名类型,而是创建一个具有您要查找的两个属性的实际类,并在控制器和测试中使用该类型。

代码语言:javascript
运行
复制
public class MyData
{
  public List<ViewModel> Data { get; set; }
  public int Total { get; set; }
}

如果不想更改代码,可以使用反射或动态关键字,如下所示:

代码语言:javascript
运行
复制
dynamic contentResult = (dynamic)result.Content;
var data = contentResult.Data
票数 2
EN

Stack Overflow用户

发布于 2021-09-28 11:35:29

这是一个解决方案,乍一看可能有点麻烦。

所以,首先要确保我们收到了一个OkNegotiatedContentResult

代码语言:javascript
运行
复制
//Act
var actionResult = controller.MethodName();

//Assert - OkNegotiated result
var resultType = actionResult.GetType().GetGenericTypeDefinition();
Assert.AreEqual(resultType.GetGenericTypeDefinition(), typeof(OkNegotiatedContentResult<>));

然后确保匿名类型定义了Data属性

免责声明:以下代码在运行时无法检索Content

代码语言:javascript
运行
复制
//Assert - Anonymous type
dynamic content = ((dynamic)actionResult).Content;
Assert.IsTrue(content.GetType().GetProperty("Data") != null);

并确保Data属性是一个集合。

代码语言:javascript
运行
复制
//Assert - Data property 
Assert.IsInstanceOfType(content.Data, typeof(IEnumerable<ViewModelName>));
var data = (IEnumerable<ViewModelName>)content.Data;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69359128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档