首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SingleResult和UnitTesting

SingleResult和UnitTesting
EN

Stack Overflow用户
提问于 2015-10-22 11:03:25
回答 2查看 1.1K关注 0票数 8

在我的BaseApiController类中有以下方法:

代码语言:javascript
复制
public virtual HttpResponseMessage GetById(int id)
{
   var entity = repository.GetById(id);

   if (entity == null)
   {                
     var message = string.Format("No {0} with ID = {1}", GenericTypeName, id);
     return ErrorMsg(HttpStatusCode.NotFound, message);
   }

   return Request.CreateResponse(HttpStatusCode.OK, SingleResult.Create(repository.Table.Where(t => t.ID == id)));
}

我将SingleResult用于OData请求(因为如果不创建SingleResult,则单个实体的$expand无法工作)。

但是现在我对这种方法在具体控制器上的UnitTests (例如AddressApiController)有问题。我总是得到NULL的结果:

代码语言:javascript
复制
[TestMethod]
public void Get_By_Id()
{
    //Arrange
    var moq = CreateMockRepository();
    var controller = new AddressApiController(moq);
    controller.Request = new HttpRequestMessage()
    controller.Request.SetConfiguration(new HttpConfiguration())
    // Action
    HttpResponseMessage response = controller.GetById(1);
    var result = response.Content.ReadAsAsync<T>().Result;

    // Accert
    Assert.IsNotNull(result);
} 

我检查并调试了GetById(),并发现repository.Table.Where(t => t.ID == id))返回适当的值,但是在SingleResult.Create之后,我得到了NULL

我该如何解决这个问题?如何从SingleResult读取内容或使用其他内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-26 23:50:19

我创建了扩展:

代码语言:javascript
复制
public static class HttpResponseMessageExtensions
    {
        public static IQueryable<T> ContentToQueryable<T>(this HttpResponseMessage response) where T : BaseEntity
        {
            var objContent = response.Content as ObjectContent;
            return objContent?.Value as IQueryable<T>;
        }

        public static T ContentToEntity<T>(this HttpResponseMessage response) where T : BaseEntity
        {
            var objContent = response.Content as ObjectContent;
            return objContent?.Value as T;
        }
    }

然后:

代码语言:javascript
复制
 var result = response.ContentToEntity<T>();
票数 0
EN

Stack Overflow用户

发布于 2015-11-02 19:57:58

我还没有机会模拟api,但这里的文档是这样的:

下面是方法签名的一些规则:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions

尝试将id更改为key和属性,这样您可能就不需要使用SingleResult了。

  • 如果路径包含一个键,则操作应该有一个名为key的参数。
  • 如果路径包含指向导航属性的键,则该操作应该有一个名为relatedKey的参数。
  • 用relatedKey参数装饰键和FromODataUri参数。
  • POST和PUT请求接受实体类型的参数。
  • 修补程序请求接受Delta类型的参数,其中T是实体类型。

我想看看这是否改变了测试结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33279489

复制
相关文章

相似问题

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