2017-07-19 1 views
1

Je commence un nouveau projet à partir de zéro. Actuellement, je travaille sur la conception de certains éléments et je tente de mettre en place des tests unitaires dès le début. Le problème, les tests unitaires échouent en raison de ce qui semble être une réponse nulle d'une action du contrôleur. Dans la fenêtre de surveillance, actionResult affiche "Erreur interne dans l'évaluateur d'expression" et contentResult est null.Pourquoi le résultat de cette action de contrôleur est-il nul?

Comment résoudre ce problème?

xUnit 2.2.0.3545, Moq 4.7.63.0

Voici le test unitaire (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. 
    } 
} 

Voici mon contrôleur:

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

L'interface de service:

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

Essayez d'appeler '.Result 'on' actionResult' puisque 'GetCities' renvoie une' tâche ' – Kyle

+0

@Kyle - actionResult, Status = RanToCompletion, Resultat = "System.Web.Http.Results.OkNegotiatedContentResult'1 [System.Collections.Generic.IEnumerable'1 [X.Y.Z.Entities.City]]". Cela semble correct mais contentResult est toujours nul. – DenaliHardtail

+0

@DenaliHardtail c'est parce que vous lancez le mauvais type – Nkosi

Répondre

2

GetCities retour IEnumerable<City>

Task<IEnumerable<City>> GetCities(); 

mais dans le casting du test que vous jetterez aux mauvais type en utilisant List<City>

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

Lorsque vous devez utiliser IEnumerable<City>

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