0

我正在尝试为我的 ApiController 编写一些单元测试并遇到了一些问题。

这是我的测试方法

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

这是我的控制器代码看起来像

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

我想将模拟数据传递给 var formData = HttpContext.Current.Request.Form["FormData"];

任何人都可以有解决这个问题的想法吗??..我真的厌倦了这项任务。

4

1 回答 1

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 对象。

于 2017-04-21T13:11:05.153 回答