【问题标题】:calling an Asp.net MVC 3 action method that updates a database in a unit testing method调用在单元测试方法中更新数据库的 Asp.net MVC 3 操作方法
【发布时间】:2011-04-22 04:41:22
【问题描述】:

编码人员,我正在为 Asp.net MVC 3 项目编写测试用例,我需要调用一个使用实体框架将数据插入数据库的操作方法。下面是action方法的代码:

//
    // POST: /School/Create

    [HttpPost]
    public ActionResult Create(School school)
    {
        if (ModelState.IsValid)
        {
            db.Schools.Add(school);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(school);
    }

这是我的测试方法的代码:

 [TestMethod]
    public void CreateNewSchool()
    {
        var schoolController = new SchoolController();
        var viewResult = schoolController.Index();

        //creating a school object
        School school = new School();
        school.Name = "OOO";

        //passing the school object to the action method
        schoolController.Create(school);

        //making sure that the model is not null
        Assert.IsNotNull(viewResult.Model);
    }

但是请注意,我不检查数据是否实际插入到数据库中。我只是检查视图的模型不为空。我确实使用 SQL Server Management Studio 手动检查数据库。

问题在于,当我在测试方法中调用操作方法以在数据库中创建/插入记录时,数据库没有发生任何事情。但是,如果我运行应用程序并浏览到创建页面并尝试创建新记录,那么该记录将被添加到数据库中。所以在我看来,只有当我运行应用程序并实际浏览到创建页面并点击创建按钮时才会插入数据库,但我不能以编程方式调用测试方法中的操作方法以在数据库中插入新记录。我还调试了测试用例,它确实命中了 db.SaveChanges();操作方法中的行,但数据库中没有反映任何更改。

那么,有人可以向我解释为什么我无法通过在我的测试方法中调用 action 方法来插入记录吗?

提前致谢。

【问题讨论】:

    标签: unit-testing entity-framework asp.net-mvc-3


    【解决方案1】:

    我会调查您的 db 上下文是如何被实例化的。在许多情况下,单元测试导致数据库往返是不可取的,因此人们使用诸如模拟之类的策略来防止它。它可能就像在运行单元测试时使用不同的连接字符串一样简单,而不是将其作为 asp.net 应用程序运行。

    【讨论】:

    • 阅读您的答案后,我调试了项目,在我点击 db.SaveChages() 之后,我检查了 db.Schools.Local.Count,它是 19!似乎所有添加的学校对象都存储在内存或其他地方,但不在数据库中。我假设 19 是我尝试运行测试用例的次数。我还能够挖掘 db.Schools.Local 中的每个对象,它们正是我试图插入到 db 中的对象。
    • @ealshabaan:调试时,检查db.Connection.ConnectionString
    • 显然,连接字符串与我的 web.config 上的不同!!!我必须手动设置连接字符串以匹配我的 web.config
    • @ealshabaan:您的测试项目文件夹中可能有一个 App.config 文件。看看那里是否定义了连接字符串。
    【解决方案2】:

    您对学校课程有任何验证吗?我猜当你在测试环境下运行它时,学校是无效的,所以 ModelState.IsValid 返回 false 并且不保存。

    【讨论】:

    • "我也调试了测试用例,它确实命中了 action 方法中的 db.SaveChanges(); 行,但数据库中没有反映任何变化。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2019-03-23
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多