Rspec Rails工厂女孩在一个规范和交易中间回滚

Rspec Rails工厂女孩在一个规范和交易中间回滚,rspec,transactions,factory-bot,Rspec,Transactions,Factory Bot,我正在我的小组模型上测试一种方法。它依赖于通过工厂创建一些徽章类型 这是密码 it "add itself to badges with method add_to_badgetypes" do badge = FactoryGirl.create(:badgetype) old_badge_ids = badge.group_ids.split(",") badge2 = FactoryGirl.create(:badgetype, :group_ids => "

我正在我的小组模型上测试一种方法。它依赖于通过工厂创建一些徽章类型

这是密码

it "add itself to badges with method add_to_badgetypes" do
    badge = FactoryGirl.create(:badgetype)
    old_badge_ids = badge.group_ids.split(",")
    badge2 = FactoryGirl.create(:badgetype, :group_ids => "3,4,5")
    group.add_to_badgetypes(badge.id, badge2.id)
    expect( badge.group_ids ).to eq( old_badge_ids.push(group.id).join(",") ) 
end
"

badge.group_id'之前是200300,之后应该是200300,{group.id}。当我跟踪日志时,我看到:

  `   Badgetype Load (0.5ms)  SELECT group_ids FROM `badge_types` WHERE `badge_types`.`id` = 40 LIMIT 1

   (0.2ms)  SAVEPOINT active_record_1

   (0.3ms)  UPDATE `badge_types` SET `group_ids` = '200,300,15' WHERE `badge_types`.`id` IS NULL

   (0.2ms)  RELEASE SAVEPOINT active_record_1

  Badgetype Load (0.4ms)  SELECT group_ids FROM `badge_types` WHERE `badge_types`.`id` = 41 LIMIT 1

   (0.1ms)  SAVEPOINT active_record_1

   (0.3ms)  UPDATE `badge_types` SET `group_ids` = '3,4,5,15' WHERE `badge_types`.`id` IS NULL

   (0.1ms)  RELEASE SAVEPOINT active_record_1

   (0.3ms)  ROLLBACK

   (0.1ms)  BEGIN
`

因此,它成功地更新了group_id,但由于某些原因,测试失败,如果我使用pp badge.group_id,我会得到原始值200300,而不是更新后的值

我假设这与“SAVEAPOINT active_record_1”有关,然后是更新,然后是释放SAVEPOINT。若然,原因为何

我如何才能让这个规范通过,因为它似乎在数据库中都搞砸了,而不是方法

谢谢

编辑

通过在控制台中玩来发现一些更有趣的信息。如果我创建一个工厂并为其指定一行:

g = FactoryGirl.create(:group)
然后运行:

g.add_to_badgetype(1,2)
我得到了这个SQL

1.9.3-p286 :080 > g.add_to_badgetypes(1, 2)
  Badgetype Load (0.5ms)  SELECT group_ids FROM `badge_types` WHERE `badge_types`.`id` = 1 LIMIT 1
   (0.1ms)  BEGIN
   (0.2ms)  UPDATE `badge_types` SET `group_ids` = 'test,8,9,10' WHERE `badge_types`.`id` IS NULL
   (0.1ms)  COMMIT
  Badgetype Load (0.3ms)  SELECT group_ids FROM `badge_types` WHERE `badge_types`.`id` = 2 LIMIT 1
   (0.1ms)  BEGIN
   (0.2ms)  UPDATE `badge_types` SET `group_ids` = '200,300,8,9,10' WHERE `badge_types`.`id` IS NULL
   (0.1ms)  COMMIT
 => [1, 2] 
注意badge_types.id为NULL的奇数UPDATE语句

如果在创建工厂后,我将其重新分配给变量,然后运行相同的命令,则它将工作:

1.9.3-p286 :081 > g = Group.last
  Group Load (0.5ms)  SELECT `groups`.* FROM `groups` ORDER BY `groups`.`id` DESC LIMIT 1
 => #<Group id: 10, group_name: "Test Group", short_name: "test_group", enrollment: false, kiosk: false, landing: 0, ro_landing: 0> 
1.9.3-p286 :082 > g.add_to_badgetypes(1, 2)
  Badgetype Load (0.6ms)  SELECT `badge_types`.* FROM `badge_types` WHERE `badge_types`.`id` = 1 LIMIT 1
   (0.1ms)  BEGIN
   (0.4ms)  UPDATE `badge_types` SET `group_ids` = 'test,8,9,10' WHERE `badge_types`.`id` = 1
   (0.2ms)  COMMIT
  Badgetype Load (0.4ms)  SELECT `badge_types`.* FROM `badge_types` WHERE `badge_types`.`id` = 2 LIMIT 1
   (0.1ms)  BEGIN
   (0.4ms)  UPDATE `badge_types` SET `group_ids` = '200,300,8,9,10' WHERE `badge_types`.`id` = 2
   (0.2ms)  COMMIT
 => [1, 2] 
因此,显然,作为工厂的组导致SQL update语句查找NULL ID


有什么想法吗?

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

我只需要重新加载变量badgetype

在平等测试之前,我补充说

@重新装弹


瞧。奇怪。

关于这个问题的更多信息&为什么会在这里发生:疯狂我花了多少时间试图弄清楚到底发生了什么,这解决了它。