Как смоделировать Request.form только для нескольких значений на контроллере в ASP.Net MVC? - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в инфраструктуре Nunit и Moq и полностью застрял в тестировании одного из моих контроллеров, поскольку он выбирает некоторые значения из Request.Form ["Something"].Я могу проверить другую часть метода контроллера с помощью nunit, но код не работает везде, где значения Request.form выбираются в том же контроллере.

Ниже приведен код тестового контроллера с использованием nunit и Moq:

      [Test]
    public void SaveRequest()
    {
        TestController test = new TestController();

        TestModel model = new TestModel();
        model = PopulateRequestModel();
        Mail = model.Mail;
        HttpContext.Current = new HttpContext(new HttpRequest("", "https://localhost", ""), new HttpResponse(new System.IO.StringWriter()));
        System.Web.SessionState.SessionStateUtility.AddHttpSessionStateToContext(HttpContext.Current, new HttpSessionStateContainer("", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 20000, true, HttpCookieMode.UseCookies, SessionStateMode.InProc, false));

        System.Web.HttpContext.Current.Session["__RequestVerificationTokenError"] = false;

        var httpContext1 = (new Mock<HttpContextBase>());
        var routeData = new RouteData();
        httpContext1.Setup(c => c.Request.RequestContext.RouteData).Returns(routeData);

        httpContext1.Setup(c => c.Request.Form).Returns(delegate()
        {
            var nv = new NameValueCollection();
            nv.Add("Firstname", "Dave");
            nv.Add("LastName", "Smith");
            nv.Add("Email", "jsmith@host.com");
            nv.Add("Comments", "Comments are here...");
            nv.Add("ReceiveUpdates", "true");
            return nv;
        });


        if (LoggedInEnterpriseId != null)
        {
            ViewResult result = test.SaveRequest(model, mail) as ViewResult;
            Assert.IsNotNull(result);
        }
    }

PopulateRequestModel:

        private RequestModel PopulateRequestModel ()
    {
        RequestModel model = new RequestModel ();

        model.Firstname = "Dave";
        model.LastName = "Smith";
        model.Email = "jsmith@host.com";
        model.Comments = "Comments are here...";
        model.ReceiveUpdates = true;


        return model;

    }

Ниже приведен фактический метод контроллера, подлежащий тестированию:

     [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SaveRequest(TestModel model, HttpPostedFileBase Mail)
    {

        string Name = Request.Form["Firstname"].ToString();
        model.Mail = Mail;

        //Start Adding Request to DB
        Logger.Write("Start: Adding new request..");
        try
        {
            using (db = new DatabaseContext())
            {
                NewRequest newRequest = new NewRequest();

                if (RequestNumber != 0)
                {
                    newRequest.Name = Convert.ToInt16(Request.Form["Firstname"]);
                    newRequest.LastName = Request.Form["LastName"];
                    newRequest.Email = Request.Form["Email"];
                    newRequest.Comments = Request.Form["Comments"];                       
                    newRequest.ReceiveUpdates = Convert.ToBoolean(Request.Form["ReceiveUpdates"]);               
                }
                else
                {

                    newRequest.Name = model.Firstname;
                    newRequest.LastName = model.LastName;
                    newRequest.Email = model.Email;
                    newRequest.Comments = model.Comments;                       
                    newRequest.ReceiveUpdates = model.ReceiveUpdates;     

                }
                db.NewRequests.Add(newRequest);
                int save = db.SaveChanges();

    }   

Код блокируется везде, где используется request.form.

...