更新:固定!!!!! 因为我怀疑这是一个以某种方式搞砸了的配置 - 接下来发了很多头发。出于某种原因,“require'test_help'”已从test_helper.rb中删除,将其重新添加并且所有测试现在都在事务中。
这闻起来像一个基本的配置问题,但我无法弄清楚是什么。 Rails 2.3.5,Ruby 1.8.7补丁173.我正在使用Shoulda +工厂女孩,并进行测试,创建了几个用户进行设置
class UserTest < ActiveSupport::TestCase
use_transactional_fixtures = true
context "getting a user's email" do
setup do
... stubs ...
end
should "populate email field if not present" do
@user = Factory.create(:molly_perkins)
@user.get_email(@facebook_session)
assert_equal 'molly.perkins.test@gmail.com', @user.email
end
should "not populate email if already present" do
@user = Factory.create(:amanda_levy)
@user.get_email(@facebook_session)
assert_equal 'amandalevy06@gmail.com', @user.email
end
end
end
测试通过,但问题是这些似乎在运行后没有被清除 - 看看test.log,我看到事务提交插入!是什么赋予了?
# First test
User Create (0.3ms) INSERT INTO `users` ...
SQL (0.4ms) COMMIT
# Second test
SQL (0.1ms) BEGIN
User Create (0.3ms) INSERT INTO `users` ....
SQL (0.4ms) COMMIT
SQL (0.1ms) BEGIN
User Update (0.4ms) UPDATE `users` ....
SQL (0.4ms) COMMIT
要解决这个问题,我只是使用了“Model.all.each(&amp;:destroy)”的拆解块,但我不应该这样做,而且必须摧毁一切都很慢/笨拙我实例化。交易应该只是回滚......
测试数据库中的表是InnoDB:
mysql> select engine from tables where table_name = 'users' and table_schema = 'voltron_test';
+--------+
| engine |
+--------+
| InnoDB |
+--------+
我正在使用事务性工具(来自test_helper.rb):
class ActiveSupport::TestCase
use_transactional_fixtures = true
end
交易确实有效(从控制台访问测试数据库):
mysql> select * from users;
Empty set (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `users` ...
Query OK, 1 row affected (0.00 sec)
mysql> select * from users;
...
1 row in set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
Empty set (0.00 sec)
答案 0 :(得分:3)
我从未在测试用例中使用过use_transaction_fixtures = true
,但有alwsays:
class Test::Unit::TestCase
....
self.use_transactional_fixtures = true
....
end
在Rails附带的test / test_helper.rb文件中,从未遇到过这个问题。
答案 1 :(得分:0)
如果您使用的是MyISAM数据库引擎,这很正常,因为它不支持事务。
答案 2 :(得分:0)
小点,但您应该self.use_transactional_fixtures = true
“自我”是必要的。