IHttpActionResult和Integration Testing Web API v2进入MS Test

 ciaos 发布于 2023-02-12 19:55

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));

但我不认为它实际上是测试任何东西,除了有某种回报.任何帮助将不胜感激.

1 个回答
  • 考虑一下您对内存数据库更改的评论,以下是您可以在场景中编写测试的一些示例:

        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);
    

    2023-02-12 19:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有