2016-12-12 6 views
1

WebApiのポストメソッドをテストしようとしています。しかし、私は、テストが失敗した理由を完全に混乱させています。クラスコンストラクタのようなものは初期化されていません。ここ
は、テスト対象のメソッドです:
WebApi Moq。テスト中のメソッドのフィールドが初期化されていません

public async Task<IHttpActionResult> Post(TourObjectViewModel viewmodel) 
{ 
    var answer = new ActionAnswer(); \\this variable is null 
    try 
    { 
     var dto = new TourObjectDTO 
     { 
      TypeId = viewmodel.TypeId, 
      Name = viewmodel.Name, 
      Address = viewmodel.Address, 
      Latitude = viewmodel.Latitude, 
      Longitude = viewmodel.Longitude, 
      CountryId = viewmodel.CountryId, 
      RegionId = viewmodel.RegionId, 
      CityId = viewmodel.CityId.Value, 
      Rating = viewmodel.Rating, 
      InternalRating = viewmodel.InternalRating, 
      CheckInTime = viewmodel.CheckInTime, 
      CheckOutTime = viewmodel.CheckOutTime, 
      HowToGet = viewmodel.HowToGet, 
      Web = viewmodel.Web, 
      Email = viewmodel.Email 
     }; 
     answer = await _tos.Add(dto); 
    } 
    catch (Exception ex) 
    { 
     Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex); 
     return BadRequest(answer.ToString());    
    } 
    return Ok(answer.ToString()); 
} 

そしてここでは、試験方法である:

[TestMethod] 
public async Task AddTourObject() 
{ 
    // Упорядочение 
    var mockService = new Mock<ITourObjectService>(MockBehavior.Default); 
    var dto = new TourObjectDTO() 
    { 
     TypeId = 10, 
     Name = "fgasdfsdfasdf", 
     Address = "fgasdfsdfasdf", 
     Latitude = 120.22, 
     Longitude = 220.34, 
     CountryId = 1, 
     RegionId = 2, 
     CityId = 1, 
     Rating = 2, 
     InternalRating = 2, 
     CheckInTime = "12:00", 
     CheckOutTime = "12:00", 
     HowToGet = "sss", 
     Web = "web", 
     Email = "" 
    }; 
    var viewmodel = new TourObjectViewModel 
    { 
     TypeId = 10, 
     Name = "fgasdfsdfasdf", 
     Address = "fgasdfsdfasdf", 
     Latitude = 120.22, 
     Longitude = 220.34, 
     CountryId = 1, 
     RegionId = 2, 
     CityId = 1, 
     Rating = 2, 
     InternalRating = 2, 
     CheckInTime = "12:00", 
     CheckOutTime = "12:00", 
     HowToGet = "sss", 
     Web = "web", 
     Email = "" 
    }; 
    mockService.Setup(x => x.Add(dto)).ReturnsAsync(new ActionAnswer { }); 
    var controller = new TourObjectController(mockService.Object); 
    // Действие 
    var result = await controller.Post(viewmodel); 
    // Утверждение 
    Assert.IsNotNull(result); 
    Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<ActionAnswer>)); 
} 

テストはNREで失敗しました:

System.NullReferenceException:Ссылканаобъектнеуказываетを экземпляробъекта.. вキャンプ。 Api.Controllers.TourObjectController。 <Post> d__5.MoveNext() Dв:\ Devの\キャンプ\ Camps.Api \コントローラ\ TourObjectController.cs:147

+1

テストが失敗した理由に関するエラーメッセージを投稿してください。 – Stormhashe

+0

@Nkosi、_tosはコントローラに注入されたサービスです。メソッドシグネチャを追加するには:public async Task Add(TourObjectDTO dto) –

+0

@ andrey.shedkoあなたの投稿を読み直した後に、それで私はなぜ私のコメントを削除した。私の答えをチェックする – Nkosi

答えて

0

строка追加のセットアップが特定のオブジェクトを期待していますが、中に新しいオブジェクトを構築していますテスト中のメソッド。アドバイスにActionAnswerを返すだけの場合は、

mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { }); 
関連する問題