我的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,则对单个实体的$expand不起作用)。

但是现在我在具体 Controller (例如AddressApiController)上对该方法的UnitTests遇到了问题。我总是得到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之后,我得到了NULL

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

最佳答案

我还没有机会模拟一个api,但是来自这里的文档:

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

尝试将id更改为key和attribute,那么您可能不需要使用SingleResult

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

  • 我很想看看这是否会改变测试结果。

    关于c# - 单结果和单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33279489/

    10-10 17:58