VS2013根据我的EF上下文为我自动生成了一个web api v2控制器.我正在尝试对控制器的放置部分进行单元测试.无论我做什么,我都无法通过检查StatusCodeResult返回来获取断言.自动生成的代码如下所示:
// PUT api/Vendor/5 public IHttpActionResult PutVendor(int id, Vendor vendor) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != vendor.Id) { return BadRequest(); } db.Entry(vendor).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!VendorExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); }
我的集成测试如下所示:
[TestMethod] public void PutVendor_UpdateVendorRecord_ReturnsTrue() { // Arrange //CleanUpVendors(); var controller = new VendorController(ctx); const string vendorName = "Unit Test Company"; // Add vendor to database ctx.Vendors.Add(new Vendor { Active = true, Name = vendorName }); ctx.SaveChanges(); var myVendor = (from v in ctx.Vendors where v.Name == vendorName select v).FirstOrDefault(); // Get Newly Inserted ID Assert.IsNotNull(myVendor, "Vendor is Null"); myVendor.Name = "New Name"; // Act var httpActionResult = controller.PutVendor(myVendor.Id, myVendor); //var response = httpActionResult as OkNegotiatedContentResult; var response = httpActionResult as OkNegotiatedContentResult ; // Assert }
我的测试有问题吗?我的Asserts应该是什么样的?
这个断言返回true:
Assert.IsInstanceOfType(httpActionResult, typeof(System.Web.Http.Results.StatusCodeResult));
但我不认为它实际上是测试任何东西,除了有某种回报.任何帮助将不胜感激.
考虑一下您对内存数据库更改的评论,以下是您可以在场景中编写测试的一些示例:
PeopleController people = new PeopleController(); // mismatched person Id returns BadRequest Person person = new Person(); person.Id = 11; person.Name = "John updated"; IHttpActionResult result = people.PutPerson(10, person).Result; Assert.IsInstanceOfType(result, typeof(BadRequestResult)); // --------------------------------------------------- // non-existing person Person person = new Person(); person.Id = 1000; person.Name = "John updated"; IHttpActionResult result = people.PutPerson(1000, person).Result; Assert.IsInstanceOfType(result, typeof(NotFoundResult)); // -------------------------------------------------------- //successful update of person information and its verification Person person = new Person(); person.Id = 10; person.Name = "John updated"; IHttpActionResult result = people.PutPerson(10, person).Result; StatusCodeResult statusCodeResult = result as StatusCodeResult; Assert.IsNotNull(statusCodeResult); Assert.AreEqual<HttpStatusCode>(HttpStatusCode.NoContent, statusCodeResult.StatusCode); //retrieve the person to see if the update happened successfully IHttpActionResult getPersonResult = people.GetPerson(10).Result; OkNegotiatedContentResult<Person> negotiatedResult = getPersonResult as OkNegotiatedContentResult<Person>; Assert.IsNotNull(negotiatedResult); Assert.AreEqual<string>(person.Name, negotiatedResult.Content.Name);