[TestMethod]
public void ProductControllerTest_UpdateProduct_Expect_ProductModelUpdated()
{
/***************
* Arrange.
***************/
//Define a couple of instances of Product.
var originalProduct = new Product() { Id = 2, Colour = "Red", Name = "Roger" };
var newProduct = new Product() { Id = originalProduct.Id, Colour = "Green", Name = "George" };
//When GetExistingProduct is called, return the originalProduct instance of Product.
_stubProductProvider.Stub(p => p.GetExistingProduct(Arg<int>.Is.Anything))
.Return(originalProduct);
//Create an instance of the ProductController, using our HttpContext stub.
var controller = new ProductController(_stubProductProvider);
controller.ControllerContext = new ControllerContext(_stubHttpContext, new RouteData(), controller);
//Provide the controller with the test values in lieu of a genuine POST of a FORM.
//We want to simulate the user submitting the details we defined in newProduct.
controller.ValueProvider = new FormCollection(
new NameValueCollection()
{
{"Name", newProduct.Name},
{"Colour", newProduct.Colour},
{"Id", newProduct.Id.ToString()}
}
).ToValueProvider();
/***************
* Act.
***************/
ViewResult viewResult = controller.UpdateProduct(newProduct.Id);
/***************
* Assert.
***************/
var actualModel = viewResult.ViewData.Model;
Assert.IsInstanceOfType(actualModel, typeof(Product));
Assert.AreEqual(newProduct.Colour, ((Product)actualModel).Colour);
Assert.AreEqual(newProduct.Id, ((Product)actualModel).Id);
Assert.AreEqual(newProduct.Name, ((Product)actualModel).Name);
}