【问题标题】:Clearing the test database between unit and functional tests in Rails (factory_girl)在 Rails (factory_girl) 中清除单元测试和功能测试之间的测试数据库
【发布时间】:2009-07-27 16:43:05
【问题描述】:

最近我从 fixtures 切换到 factory_girl 来测试我的 Ruby on Rails 应用程序。如果我运行 rake test:units,在我的 /units 目录中运行测试,它们都运行得很好。如果我使用 rake test:functionals 运行我的功能测试(在我的 /functional 目录中),情况也是如此。

但是,如果我只是简单地运行 rake 测试,同时运行我的单元测试和功能测试,我的第二组测试(在本例中为功能测试)的验证失败,并显示消息“验证失败:名称已经采取了。”

我相信这是由于功能测试创建的对象与在单元测试中创建的对象具有相同的参数 - 导致我相信在单元测试和功能测试之间没有清除测试数据库。

我使用 factory_girl 的排序来获得对象的唯一属性,这意味着 factory_girl 在测试之间被重置,而数据库则没有。我能做些什么来解决这个问题?有没有办法清除我的两个测试包之间的数据库?

【问题讨论】:

  • 你找到解决这个问题的方法了吗?我有完全相同的。由于某种原因,工厂女孩序列在功能测试和单元测试之间被重置。

标签: ruby-on-rails ruby unit-testing factory-bot


【解决方案1】:

清除(重建)测试数据库的命令行解决方案:

rake db:test:prepare

【讨论】:

    【解决方案2】:

    试着在你的test/test_helper.rb写这个

    eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile"))
    class Test::Unit::TestCase
     ....
     #db:test:prepare won't work, don't know why,
     #as DROP DATABASE won't execute (me on PostgreSQL).
     #even if I write,
     #ActiveRecord::Base.connection.disconnect!
     Rake::Task["db:reset"].invoke
    end
    

    不是推荐的解决方案。它使测试变慢,但它可以工作。

    【讨论】:

    • 完美,谢谢!我目前没有太多测试,所以速度还不是大问题。
    • 这也适用于我!有人知道为什么会这样吗?我使用工厂已经有一段时间了,这从来都不是问题。似乎从 factory-girl 更新到 factory-girl-rails 是问题的原因......我正在使用 rails 3.2.2
    【解决方案3】:

    名为“override_rake_task”的 Rails 插件可用于覆盖在 Rails gem 中定义的 Rake 任务“test”。这是一个非常简单的任务,依次执行 3 个其他任务:test:unitstest:functionalstest:integration。您可以在执行 test:functionals 之前包含执行“db:test:purge”任务以清除测试数据库。

    显然,如果你没有使用这个插件,并且你在你的 rails 应用程序中定义了一个同名的任务,rake 将执行两个任务:默认任务和你的任务。

    【讨论】:

    • 有没有办法在单元测试和功能测试之间执行 db:test:purge 而不会覆盖默认的 rake 任务?
    • 是的,你可以在没有插件的情况下做同样的事情,首先删除默认任务并添加一个具有相同代码的新任务 + "db:test:purge": "remove_task :test" 然后“任务:测试做......结束”。我在这里看到了这个:taknado.com/2007/7/30/overriding-rake-tasks
    【解决方案4】:

    上述解决方案对我不起作用。如果您尝试访问外部数据库,运行单元测试可能会出现一些奇怪的错误。由于某种原因,它们在运行测试后没有被清除,因此您必须在运行单元测试后运行rake db:test:purge。把它放在你的Rakefile 中,它应该可以修复它。

    Rake::Task["db:test:prepare"].enhance do
      Rake::Task["db:test:purge"].invoke
    end
    

    【讨论】:

      【解决方案5】:

      我在我的机器上遇到了这个问题。我因验证问题而导致测试失败,因为在测试之间没有正确重置数据库。关于我的情况的一些背景故事:

      -我有一个 linux 机器,并且正在运行我知道应该通过测试的代码。 -我买了一台安装了 Lion 的 Mac,并试图让我的代码在这台机器上运行。 -我从源代码安装了mysql

      一切安装正常。我的数据库工作正常,rails 可以访问它。然而,当我运行测试时,我遇到了同样的问题。我遇到了这篇文章,并尝试了两种建议的解决方案(尽管它看起来不像是代码问题,但它似乎是一个配置问题,因为 rake 在我的 linux 机器上运行良好)。这些解决方案都不起作用。

      我删除了mysql:

      sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /图书馆/PreferencePanes/我的* sudo rm -rf /图书馆/收据/mysql* sudo rm -rf /图书馆/收据/MySQL* 须藤 rm /etc/my.cnf sudo rm /usr/local/bin/mysql*

      我用自制软件重新安装了 mysql,而不是从源代码手动安装(这一步是根据同事的建议):

      导出 PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH" 冲泡安装 https://github.com/adamv/homebrew-alt/raw/master/versions/mysql51.rb 未设置 TMPDIR mysql_install_db

      然后我重新运行 rake,所有测试都通过了。如果有人在 Lion 上,从源代码构建了 mysql,并遇到了这个问题,这可能是一个解决方案。

      【讨论】:

        【解决方案6】:

        DB Cleaner 是一个非常不错的 gem,专门用于在测试之间进行清理。它提供了一些选项,包括将每个测试包装在事务中并回滚、截断表和删除。

        它还支持多个 ORMS,以防您不使用/使用超过活动记录。

        文档非常好,其中包括将其与 MiniTest、Rspec 和 Cucumber 一起使用的示例。

        https://github.com/bmabey/database_cleaner

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多