单元测试中的验证失败

ste*_*ris 9 .net c# post unit-testing asp.net-web-api

我正在对我的PostMyModel路线进行单元测试.但是,在PostMyModel()Validate<MyModel>(model)更改后使用该行重新验证我的模型.我正在使用测试上下文,以便不依赖于单元测试的数据库.我已经发布了下面的测试上下文和post方法:

测试环境

class TestAppContext : APIContextInterface
    {

        public DbSet<MyModel> MyModel { get; set; }

        public TestAppContext()
        {
            this.MyModels = new TestMyModelDbSet();
        }

        public int SaveChanges(){
            return 0;
        }
        public void MarkAsModified(Object item) {

        }

        public void Dispose() { }

    }
Run Code Online (Sandbox Code Playgroud)

发布方法

[Route(""), ResponseType(typeof(MyModel))]
        public IHttpActionResult PostMyModel(MyModel model)
        {
            //Save model in DB
            model.status = "Waiting";
            ModelState.Clear();
            Validate<MyModel>(model);

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

            db.MyModels.Add(model);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (MyModelExists(model.id))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DisplayMyModel", new { id = model.id }, model);
        }
Run Code Online (Sandbox Code Playgroud)

当该Validate<MyModel>(model)行运行时,我收到错误:

System.InvalidOperationException: ApiController.Configuration must not be null.
Run Code Online (Sandbox Code Playgroud)

我怎么能纠正这个?

ste*_*ris 21

为了运行Validate命令,必须有与控制器关联的模拟HttpRequest.执行此操作的代码如下.这将模拟默认的HttpRequest,在这种情况下它是相当未使用的,允许对方法进行单元测试.

 HttpConfiguration configuration = new HttpConfiguration();
            HttpRequestMessage request = new HttpRequestMessage();
            controller.Request = request;
            controller.Request.Properties["MS_HttpConfiguration"] = configuration;
Run Code Online (Sandbox Code Playgroud)

  • 可以更简单:controller.Request = new HttpRequestMessage(); controller.Request.Properties ["MS_HttpConfiguration"] = new HttpConfiguration(); (4认同)