20

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

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

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

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

4

6 回答 6

13

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

rake db:test:prepare
于 2013-03-17T21:04:37.303 回答
12

试着在你的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

不是推荐的解决方案。它使测试变慢,但它有效。

于 2009-07-28T02:32:03.820 回答
4

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

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

于 2009-07-27T16:57:08.377 回答
2

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

Rake::Task["db:test:prepare"].enhance do
  Rake::Task["db:test:purge"].invoke
end
于 2009-10-31T04:15:36.917 回答
1

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

-我有一个 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 /Library/PreferencePanes/My*
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,并遇到了这个问题,这可能是一个解决方案。

于 2011-10-06T22:21:19.737 回答
0

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

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

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

https://github.com/bmabey/database_cleaner

于 2014-06-08T03:13:06.967 回答