Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在Web api中模拟Request.form_Unit Testing_Asp.net Web Api_Httprequest_Rhino Mocks_Request.form - Fatal编程技术网

Unit testing 如何在Web api中模拟Request.form

Unit testing 如何在Web api中模拟Request.form,unit-testing,asp.net-web-api,httprequest,rhino-mocks,request.form,Unit Testing,Asp.net Web Api,Httprequest,Rhino Mocks,Request.form,我正试图为我的ApiController编写一些单元测试,但遇到了一些问题 这是我的测试方法 [TestMethod] public void CustomerController_AddUnitTest() { var custid = Guid.NewGuid(); var customers = new Customer() { CustomerName = "Enterprise", Custo

我正试图为我的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);
        }
[TestMethod]
public void CustomerController\u AddUnitTest()
{
var custid=Guid.NewGuid();
var customers=new Customer(){CustomerName=“Enterprise”,CustomerId=custid};
var rmContext=MockRepository.GenerateMock();
var rmRequest=MockRepository.GenerateMock();
Stub(x=>x.Request).Return(rmRequest);
var FormData=newnamevalueCollection{{“FirstName”、“Jonathan”}、{“LastName”、“Danylko”};
rmRequest.Stub(r=>r.Form).Return(FormData);
Stub(p=>p.Request).Return(rmRequest);
var forms=rmContext.Request.Form;
>//在这里,我可以获取表单值,但无法传递这些值
>至主控制器
var mockRepository=mockRepository.GenerateMock();
mockRepository.Stub(x=>x.Add(newcustomer()).IgnoreArguments().Return(1);
_customerController=新customerController(mockRepository);
var result=_customerController.CustomerAdd();
Assert.IsNotNull(结果);
}
这是我的控制器代码看起来像

  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);
    }
public int CustomerAdd()
{
var localhost=HttpContext.Current.Request.Url.Authority;

var formData=HttpContext.Current.Request.Form[“formData”]; JavaScriptSerializer json_serializer=新JavaScriptSerializer(); var customer=json_序列化程序。反序列化(formData); 如果(HttpContext.Current.Request.Files.Count>0) { HttpPostedFile=HttpContext.Current.Request.Files[0]; 字符串文件名=customer.CustomerName.Trim()+“”+file.fileName; var filePath=HttpContext.Current.Server.MapPath(Constants.FileUploadImagePath+fileName); file.SaveAs(文件路径); customer.Logo=文件名; } return\u iccustomerservice.Add(客户); }

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


有人能想出办法来解决这个问题吗?..我真的受够了这个任务。

把这条线拉到一个单独的(虚拟)方法中,然后在测试中,使用控制器的一个部分模拟,在这个部分模拟中,你已经用新方法来返回模拟数据。(这称为“测试接缝”供参考)

大概是这样的:

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;
}
public int CustomerAdd()
{
var localhost=HttpContext.Current.Request.Url.Authority;
var formData=GetFormData()[“formData”];
JavaScriptSerializer json_serializer=新JavaScriptSerializer();
var customer=json_序列化程序。反序列化(formData);
如果(HttpContext.Current.Request.Files.Count>0)
{
HttpPostedFile=HttpContext.Current.Request.Files[0];
字符串文件名=customer.CustomerName.Trim()+“”+file.fileName;
var filePath=HttpContext.Current.Server.MapPath(Constants.FileUploadImagePath+fileName);
file.SaveAs(文件路径);
customer.Logo=文件名;
}
return\u iccustomerservice.Add(客户);
}
公共虚拟名称值集合GetFormDatat()
{
返回HttpContext.Current.Request.Form;
}
然后在测试中使用此选项:

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

或者,您也可以做同样的事情,但是对于上下文对象的使用。

被测试的方法设计得很糟糕,并且与静态依赖关系紧密耦合,这使得测试变得很困难。尽量避免将代码与
HttpContext
紧密耦合。是的,我知道。但我不知道如何模拟这行代码var formData=HttpContext.Current.Request.Form[“formData”];我尝试了所有方法,但有时我们的方法不足以找到正确的答案……一般来说,您永远不希望生产代码直接引用您的模拟框架类型。在最初的文章中,您展示了将模拟存储库作为构造函数参数的控制器类——这永远不会发生。模拟框架旨在模拟您实际使用的类型,这样您的产品就不需要了解您的测试代码。