2017-07-19 18 views
1

私は最初から新しいプロジェクトを開始しています。現在、私はいくつかの要素を設計し、初期段階で単体テストを実装しようとしています。問題は、コントローラーアクションからのヌル応答のように見えるため、ユニットテストが失敗していることです。ウォッチウィンドウで、actionResultは "式エバリュエータの内部エラー"を表示し、contentResultはnullです。このコントローラのアクションの結果がnullであるのはなぜですか?

これを修正するにはどうすればよいですか?

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

サービスインターフェース:

+0

を使用する必要がある場合は、テストのキャストにあなたがList<City>

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

を使用して間違った型にキャストしIEnumerable<City> '' GetCities'が 'Task ' – Kyle

+0

@Kyle - actionResult、Statusを返すので 'actionResult'に= RanToCompletion、Result = "System.Web.Http.Results.OkNegotiatedContentResult'1 [System.Collections.Generic.IEnumerable'1 [X.Y.Z.Entities.City]]"。これは正しく表示されますが、contentResultはまだnullです。 – DenaliHardtail

+0

@DenaliHardtailは間違ったタイプにキャストしているためです – Nkosi

答えて

2

GetCitiesリターン

Task<IEnumerable<City>> GetCities(); 

いますが、 `.Resultを呼び出してみIEnumerable<City>

var contentResult = actionResult as OkNegotiatedContentResult<IEnumerable<City>>; 
関連する問題