测试Patch odata web api方法

时间:2014-07-25 10:08:53

标签: c# asp.net-web-api odata asp.net-web-api2

我需要在我的测试项目的odata控制器中测试以下Patch方法。

[ValidateModel]
        [AcceptVerbs("PATCH", "MERGE")]
        public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<User> patch)
        {
            var user = await db.Users.FindAsync(key);
            if (user == null)
            {
                return NotFound();
            }

            patch.Patch(user);

            Validate(user);

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            try
            {
                db.Entry(user).Property(p => p.UserType).IsModified = false;
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!UserExists(key))
                {
                    return NotFound();
                }
                throw;
            }

            return Updated(user);
        }

测试项目中的代码如下。有人能告诉我如何将值传递给Delta参数。目前我在线控制器上获得编译错误。补丁(1,用户);。

[TestMethod]
        public void TestPatch()
        {
            // Arrange
            var controller = new UsersController();

            var user = new User();
            user.Id = 1;
            user.Lastname = "Johanson";
            // Act
            controller.Patch(1,  <System.Web.OData.Delta> user);

            // Assert
        }

3 个答案:

答案 0 :(得分:5)

您还可以使用dynamic关键字声明delta并直接设置属性:

dynamic delta = new Delta<User>();
delta.Id = 1;
delta.Lastname = "Johanson";

答案 1 :(得分:4)

var delta = new Delta<User>(typeof(User));
delta.TrySetPropertyValue("Id", 1);
delta.TrySetPropertyValue("Lastname", "Johanson");

我不知道是否有任何帮助使这更容易

答案 2 :(得分:3)

@ yenta的回答非常好,但如果可以,也可以考虑使用nameof(自C#6.0以来)

var delta = new Delta<User>(typeof(User));
delta.TrySetPropertyValue(nameof(User.Id), 1);
delta.TrySetPropertyValue(nameof(User.Lastname), "Johanson");