2017-07-19 19 views
1

Ich beginne ein neues Projekt von Grund auf neu. Zur Zeit arbeite ich an der Entwicklung einiger Elemente und versuche, Unit-Tests frühzeitig zu implementieren. Das Problem besteht darin, dass die Komponententests fehlschlagen, da scheinbar eine Nullantwort von einer Controlleraktion vorliegt. Im Watch-Fenster zeigt actionResult "Interner Fehler im Expression-Evaluator" und contentResult ist null.Warum ist das Ergebnis dieser Controlleraktion null?

Wie behebe ich das?

xunit 2.2.0.3545, Moq 4.7.63.0

Hier ist die Unit-Test (xunit):

// Used in the unit tests 
private List<City> cities = new List<City> 
{ 
new City { City_Name = "Chicago", City_Code = 1 }, 
new City { City_Name = "New York", City_Code = 2 }, 
new City { City_Name = "Seattle", City_Code = 3 } 
}; 

[Fact] 
public async Task Get_AllCities_PropertiesArePopulated() 
{ 
    // Arrange 
    var mockService = new Mock<ICityService>(); 
    mockService.Setup(x => x.GetCities()).ReturnsAsync(this.cities); 

    var controller = new CityController(mockService.Object); 

    // Act 
    IHttpActionResult actionResult = await controller.GetCities(); 
    var contentResult = actionResult as OkNegotiatedContentResult<List<City>>; 

    foreach (var city in contentResult.Content) 
    { 
     // doesn't get here due to .Content being null. 
    } 
} 

Hier mein Controller ist:

public class CityController : ApiController 
{ 
    private readonly ICityService cityService; 

    public CityController(ICityService svc) 
    { 
     this.cityService = svc; 
    } 

    public async Task<IHttpActionResult> GetCities() 
    { 
     var cities = await this.cityService.GetCities(); 

     if (!cities.Any()) 
     { 
      return this.BadRequest(); 
     } 

     return this.Ok(cities); 
    } 
} 

Die Service-Schnittstelle:

public interface ICityService 
{ 
    Task<IEnumerable<City>> GetCities(); 
} 
+0

Versuchen Aufruf '.RESULT verwenden sollten 'on' actionResult 'seit' GetCities' gibt einen 'Task ' – Kyle

+0

@Kyle - actionResult, Status zurück = RanToCompletion, Result = "System.Web.Http.Results.OkNegotiatedContentResult'1 [System.Collections.Generic.IEnumerable'1 [X.Y.Z.Entities.City]]". Dies scheint korrekt, aber contentResult ist immer noch null. – DenaliHardtail

+0

@DenaliHardtail das ist, weil Sie auf den falschen Typ werfen – Nkosi

Antwort

2

GetCities Rückkehr IEnumerable<City>

Task<IEnumerable<City>> GetCities(); 

aber in der Besetzung des Test Sie es auf die falsche Art werfen List<City>

var contentResult = actionResult as OkNegotiatedContentResult<List<City>>; 

Verwendung Wenn Sie IEnumerable<City>

var contentResult = actionResult as OkNegotiatedContentResult<IEnumerable<City>>; 
Verwandte Themen