0

내 ApiController에 대한 일부 단위 테스트를 작성하려고하는데 몇 가지 문제가 있습니다. 여기 웹 api에서 Request.form을 조롱하는 방법

이 나는 ​​사람이 문제를 해결하기 위해 아이디어를 가질 수 var formData = HttpContext.Current.Request.Form["FormData"];

에 모의 데이터를 전달하려는

public int CustomerAdd() 
    { 
     var localhost = HttpContext.Current.Request.Url.Authority; 
     var formData = HttpContext.Current.Request.Form["FormData"]; 
     JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
     var customer = json_serializer.Deserialize<Customer>(formData); 
     if (HttpContext.Current.Request.Files.Count > 0) 
     { 
      HttpPostedFile file = HttpContext.Current.Request.Files[0]; 
      string fileName = customer.CustomerName.Trim() + "_" + file.FileName; 
      var filePath = HttpContext.Current.Server.MapPath(Constants.FileUploadImagePath + fileName); 
      file.SaveAs(filePath); 
      customer.Logo = fileName; 
     } 
     return _iCustomerService.Add(customer); 
    } 

처럼 내 컨트롤러 코드가 보인다 내 TestMethod

 [TestMethod] 
     public void CustomerController_AddUnitTest() 
     { 


      var custid = Guid.NewGuid(); 
      var customers = new Customer() { CustomerName = "Enterprise", CustomerId = custid }; 
      var rmContext = MockRepository.GenerateMock<HttpContextBase>(); 
      var rmRequest = MockRepository.GenerateMock<HttpRequestBase>(); 
      rmContext.Stub(x => x.Request).Return(rmRequest); 
      var FormData = new NameValueCollection { { "FirstName", "Jonathan" }, { "LastName", "Danylko" } }; 
      rmRequest.Stub(r => r.Form).Return(FormData); 
      rmContext.Stub(p => p.Request).Return(rmRequest); 
      var forms = rmContext.Request.Form; 

> // here i am able to get forms value but i couldn't pass these value 
> to main controller 

      var mockRepository = MockRepository.GenerateMock<ICustomerService>(); 
      mockRepository.Stub(x => x.Add(new Customer())).IgnoreArguments().Return(1); 
      _customerController = new CustomerController(mockRepository); 
      var result = _customerController.CustomerAdd(); 
      Assert.IsNotNull(result); 
     } 

입니다 나는이 일에 실망했다.

+0

테스트중인 메서드는 잘못 설계되어 정적 종속성과 밀접하게 연결되어 테스트하기가 어렵습니다. 코드를 HttpContext에 단단히 연결하는 것을 피하십시오. – Nkosi

+0

예, 알고있었습니다. 하지만이 코드 줄을 조롱하는 방법을 모르겠다. –

+0

var formData = HttpContext.Current.Request.Form [ "FormData"]; –

답변

0

별도의 (가상) 방법으로 라인을 당긴 다음 테스트에서 모의 ​​데이터를 반환하기 위해 새 메서드를 스텁 한 컨트롤러의 일부 모의 객체를 사용합니다. (이것을 "시험 솔기"라고합니다). 이 같은

뭔가 :

public int CustomerAdd() 
{ 
    var localhost = HttpContext.Current.Request.Url.Authority; 
    var formData = GetFormData()["FormData"]; 
    JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
    var customer = json_serializer.Deserialize<Customer>(formData); 
    if (HttpContext.Current.Request.Files.Count > 0) 
    { 
     HttpPostedFile file = HttpContext.Current.Request.Files[0]; 
     string fileName = customer.CustomerName.Trim() + "_" + file.FileName; 
     var filePath = HttpContext.Current.Server.MapPath(Constants.FileUploadImagePath + fileName); 
     file.SaveAs(filePath); 
     customer.Logo = fileName; 
    } 
    return _iCustomerService.Add(customer); 
} 

public virtual NameValueCollection GetFormDatat() 
{ 
    return HttpContext.Current.Request.Form; 
} 

그런 다음 테스트에서 이것을 사용 :

_customerController = MockRepository.GeneratePartialMock<CustomerContoller>(); 
_customerController.Stub(c => c.GetFormData()).Return(yourFakeFormData); 

양자 택일로, 당신은 같은 일을하지만, Context 객체의 용도에 대한 수 있습니다.

+0

일반적으로 생산 코드가 모의 프레임 워크 유형을 직접 참조하기를 원하지는 않습니다. 원래 게시물에서는 컨트롤러 클래스를 모의 저장소를 생성자 매개 변수로 사용하여 표시합니다. 이는 절대로 발생해서는 안됩니다. 모의 프레임 워크는 실제로 사용하는 유형을 조롱하여 제작자가 테스트 코드를 알 필요가 없도록하기위한 것입니다. –

관련 문제