单元测试验证IEnumerable <dynamic>的内容

时间:2016-07-05 10:45:49

标签: c# unit-testing dynamic

给出以下WebAPI方法:

public IHttpActionResult GetDeliveryTypes()
{
    return Ok(... .Select(dt => new { Id = dt.Id, Name = dt.Name }));
}

哪里

typeof(Id) = long  
typeof(Name) = string

在进行单元测试时,我该如何

  1. 断言内容是否符合我的预期?例如,以下断言失败

    var contentResult = response as OkNegotiatedContentResult<IEnumerable<dynamic>>;
    Assert.IsNotNull(contentResult);
    
  2. 将此IEnumerable<dynamic>结果减少为IEnumerable<long>,以便我可以验证它是否包含预期的值序列?

  3. 我已将InternalsVisibleTo属性添加到AssemblyInfo。

2 个答案:

答案 0 :(得分:4)

1。首先要做的事情:

@Bean
@Scope(SCOPE_PROTOTYPE)
public SynchronousRpcProxy myBean(MyObj1 notNull1, MyObj2 notNull2, MyNullable canBeNull) {
    assert notNull1 != null;
    assert notNull2 != null;
    // assert canBeNull!= null; // this is not true because canBeNull can be null
    return new SmthFromExternalLib(notNull1, notNull2, canBeNull); // do staff
}

如果需要,您可以从此处继续进行调查。

2。第二点的解决方案非常简单:

response.GetType().GetGenericTypeDefinition() == typeof(OkNegotiatedContentResult<>)

如果测试是在单独的程序集中 - 添加dynamic response = controller.GetDeliveryTypes(); Assert.True(response.GetType().GetGenericTypeDefinition() == typeof(OkNegotiatedContentResult<>)); var content = (IEnumerable<dynamic>)response.Content; var ids = content.Select(i => i.Id).ToList(); ,因为匿名类型是作为内部生成的。

答案 1 :(得分:0)

我只是使用反射来获取Content属性。

var response = controller.GetDeliveryTypes();

Assert.IsNotNull(response);
object content = response
  .GetType()
  .GetProperty("Content")
  .GetValue(response);