2016-12-15 14 views
1

一般的には、POSTリクエストをテストしているものを除いて、すべてのテストが正常に実行されています。常にBadRequestを返します。どういうわけか、それ以下のレベルの発射ではない(サービスレイヤやデータレイヤーなど)ため、何が間違っているのか正確には分かりません。テスト中の
WebApi POSTリクエストのユニットテストの正しい方法は何ですか?

[TestMethod] 
     public async Task AddTourObject() 
     { 
      // Упорядочение 
      var mockService = new Mock<ITourObjectService>(MockBehavior.Default); 
      var viewmodel = new TourObjectViewModel 
      { 
       TypeId = 10, 
       Name = "Деревья гнулись", 
       Address = "f yjxr", 
       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(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { }); 
      var controller = new TourObjectController(mockService.Object); 
      // Действие 
      var result = await controller.Post(viewmodel); 
      // Утверждение 
      Assert.IsNotNull(result); 
      Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<string>)); 
      Assert.IsTrue(result.ToString().Contains("успешно")); 
     } 

と方法:ここで
は、試験方法である

public async Task<IHttpActionResult> Post(TourObjectViewModel viewmodel) 
     { 
      var answer = new ActionAnswer(); 
      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); 
       return answer.IsSuccess == false ? (IHttpActionResult) BadRequest(answer.ToString()) : Ok(answer.ToString()); 
      } 
      catch (Exception ex) 
      { 
       Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex); 
       return BadRequest(answer.ToString());    
      } 
     } 
  1. 私が正しく、このテストを設定するのですか?
  2. これは私がテストする必要がありますか?
+0

ActionAnswer {}はどのようにIsSuccessを初期化しますか?私はコントローラが 'BadRequest'を返すことを意味する' false'を期待します。 – Johnny

+0

@Lepijohnny、通常は下のレベルのメソッド(Service Layer)、ActionAnswerメソッドを返し、IsSuccess enumをfalseまたはtrueに設定します。 –

+0

@ Lepijohnny、おそらく私はMoqの働きを理解していないでしょう。以前は、WebApi> Service> DataAccessLayerというフルサイクルを迎えていると思います。 –

答えて

1

ここでの設定は問題です。サービスを設定すると、指定された入力ごとに空のActionAnswerが返されます。

mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{})

これは、これまでのサービスに提供されるものを意味するだけで空のオブジェクトを返します。モックのアイデアは、プログラム内のさまざまな動作や異なるパスをシミュレートしようとすることです。ですから、例えば、テストのために、以下のことができシナリオ:

1)サービスは== falseのサービスがIsSuccessでActionAnswerを返すどのような場合 mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = false })

2)==真 mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = true })

ありIsSuccessでActionAnswerを返すどのような場合にはあなたが選ぶことができる道はたくさんありますが、クリティカルパスを見つけてテストすることが考えられます。

関連する問題