SingleResult和UnitTesting

时间:2015-10-22 11:03:26

标签: c# asp.net-mvc asp.net-web-api

我的from fabric.api import * env.run = local env.hosts = ["docker.me"] # change this! @task def remote(): env.run = run @task def build_file(): env.run("echo 'make image'") env.run("echo 'upload image'") @task def deploy_file(): env.run("echo 'reload image'") @task def do_all(): build_file() remote() deploy_file() 课程中有以下方法:

BaseApiController

我正在将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))); } 用于OData请求(因为如果我没有创建SingleResult,单个实体的SingleResult不起作用)。
但是现在我在具体控制器(例如AddressApiController)上遇到了这种方法的UnitTests问题。我总是得到$expand结果:

NULL

我检查并调试了[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

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

2 个答案:

答案 0 :(得分:0)

我没有机会模仿api,但是来自这里的文档:

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

尝试将id更改为key和属性,然后您可能不需要使用SingleResult

  • 如果路径包含密钥,则该操作应具有名为key的参数。
  • 如果路径包含导航属性中的键,则该操作应具有名为relatedKey的参数。
  • 使用[FromODataUri]参数装饰key和relatedKey参数。
  • POST和PUT请求获取实体类型的参数。
  • PATCH请求采用Delta类型的参数,其中T是实体类型。

我很想知道这是否会改变测试结果。

答案 1 :(得分:0)

我创建了扩展程序:

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;
        }
    }

然后:

 var result = response.ContentToEntity<T>();