2017-07-19 52 views
1

我從頭開始一個新項目。目前,我正在通過設計一些元素並試圖儘早實施單元測試。這個問題,單元測試失敗,因爲控制器動作看起來是空響應。在觀察窗口中,actionResult顯示「表達式計算器中出現內部錯誤」,contentResult爲空。爲什麼這個控制器的操作結果爲空?

我該如何解決這個問題?

的xUnit 2.2.0.3545,起訂量4.7.63.0

這裏是單元測試(的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. 
    } 
} 

這是我的控制器:

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

服務接口:

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

嘗試調用'。結果'on'actionResult'因爲'GetCities'返回一個'Task ' – Kyle

+0

@Kyle - actionResult,Status = RanToCompletion,Result =「System.Web.Http.Results.OkNegotiatedContentResult'1 [System.Collections.Generic.IEnumerable'1 [X.Y.Z.Entities.City]]」。這看起來是正確的,但contentResult仍然爲空。 – DenaliHardtail

+0

@DenaliHardtail那是因爲你正在鑄造錯誤的類型 – Nkosi

回答

2

GetCities回報IEnumerable<City>

Task<IEnumerable<City>> GetCities(); 

,但在測試的投你使用List<City>

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

將它轉換爲錯誤的類型時,你應該使用IEnumerable<City>

var contentResult = actionResult as OkNegotiatedContentResult<IEnumerable<City>>; 
相關問題