2011-02-22 61 views
3

我当前正试图测试使用TryUpdateModel()的插入方法。我伪装需要的controllercontext,虽然这工作似乎并没有发布我设置的模型。使用MStest和moq测试TryUpdateModel()

这里是我的测试方法:

[AcceptVerbs(HttpVerbs.Post)] 
    [GridAction] 
    public ActionResult _SaveAjaxEditing(int? id) 
    { 
     if (id == null) 
     { 
      Product product = new Product(); 
      if (TryUpdateModel(product)) 
      { 
       //The model is valid - insert the product. 
       productsRepository.Insert(product);// AddToProducts(product); 
      } 
     } 
     else 
     { 
      var recordToUpdate = productsRepository.Products.First(m => m.ProductID == id); 
      TryUpdateModel(recordToUpdate); 
     } 
     productsRepository.Save(); 
     return View(new GridModel(productsRepository.Products.ToList())); 
    } 

这里是我目前的测试:

 [TestMethod] 
    public void HomeControllerInsert_ValidProduct_CallsInsertForProducts() 
    { 
     //Arrange 
     InitaliseRepository(); 

     var httpContext = CustomMockHelpers.FakeHttpContext(); 
     var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller); 
     controller.ControllerContext = context; 
     //controller.ControllerContext = new ControllerContext(); 

     var request = Mock.Get(controller.Request); 
     request.Setup(r => r.Form).Returns(delegate() 
               { 
                var prod = new NameValueCollection 
                    { 
                     {"ProductID", "9999"}, 
                     {"Name", "Product Test"}, 
                     {"Price", "1234"}, 
                     {"SubCatID", "2"} 
                    }; 
                return prod; 
               }); 


     // Act: ... when the user tries to delete that product 
     controller._SaveAjaxEditing(null); 
     //Assert 
     _mockProductsRepository.Verify(x => x.Insert(It.IsAny<Product>())); 
    } 

的方法被调用,但是当它到达TryUpdateModel()现在看来,这不能拾取发布的对象。任何指向我出错的地方都会很棒。

回答

6

对其进行排序。似乎完全嘲笑Httpcontext是矫枉过正。

controller.ControllerContext = new ControllerContext(); 

var prod = new FormCollection 
      { 
       {"ProductID", "1"}, 
       {"Name", "Product Test"}, 
       {"Price", "1234"}, 
       {"SubCatID", "2"} 
      }; 

controller.ValueProvider = prod.ToValueProvider(); 

这是诀窍。现已发布。