2015-10-22 26 views
8

Mam następujące metody w moim BaseApiController zajęć:SingleResult i test jednostkowy

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

używam SingleResult na życzenie OData (bo $expand za pojedynczy jednostka nie działa, jeśli nie tworzę SingleResult).
Ale teraz mam problem z UnitTests tej metody na kontrolerze betonu (np. AddressApiController). Zawsze dostać NULL w wyniku:

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

Sprawdziłem i debugowania GetById() i dowiedzieć się, że repository.Table.Where(t => t.ID == id)) powrotną właściwą wartość, ale po SingleResult.Create Dostaję NULL.

Jak mogę rozwiązać ten problem? Jak mogę odczytać zawartość z SingleResult lub użyć czegoś innego?

+0

Czy jesteś przetestować kontroler bazowy? Proszę pokazać pełniejszy przykład swojego kodu. – Andrei

+0

Nie, testuję konkretny kontroler. Zaktualizowałem pytanie. – Marusyk

+0

Wszystko działa poprawnie, zanim dodałem 'SingleResult.Create' – Marusyk

Odpowiedz

0

stworzyłem rozszerzenia:

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

, a następnie:

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

Nie miałem okazję makiety API ale z docs tutaj:

Oto niektóre zasady dotyczące podpisów metoda: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions

zmiana Spróbuj id do key i atrybutu, to prawdopodobnie nie będzie musiał używać SingleResult.

  • Jeśli ścieżka zawiera klucz, akcja powinna mieć parametr o nazwie key.
  • Jeśli ścieżka zawiera klucz do właściwości nawigacji, akcja powinna mieć parametr namedKey.
  • Udekoruj klucz i powiązane parametry klucza za pomocą parametru [FromODataUri].
  • Żądania POST i PUT przyjmują parametr typu jednostki.
  • Żądania PATCH przyjmują parametr typu Delta, gdzie T jest typem jednostki.

Byłbym zainteresowany, aby zobaczyć, czy to zmieni wynik testu.

+0

Nie używam ODataController i routingu jak/odata/Products (1)/Suppliers (1). I widziałem ten artykuł – Marusyk

Powiązane problemy