1

グループモデルでメソッドをテストしています。ファクトリを介していくつかのバッジタイプを作成することに依存しています。

ここにコードがあります

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_ids' は前は "200, 300" で、後は "200,300,#{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_ids は正常に更新されていますが、何らかの理由でテストが失敗し、badge.group_ids を pp にすると、更新された値ではなく、元の値 (200,300) が取得されます。

これは、「SAVEAPOINT active_record_1」、UPDATE、RELEASE SAVEPOINT と関係があると思います。もしそうなら、なぜですか?

メソッドではなく、データベースですべてが台無しになっているように見えるため、この仕様を渡すにはどうすればよいですか。

ありがとう

編集

コンソールで遊んで、さらに興味深い情報を見つけました。ファクトリを作成して 1 行割り当てると、次のようになります。

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] 

奇妙な UPDATE ステートメント「WHERE Badge_types.id IS NULL」に注目してください。

ファクトリを作成した後、それを変数に再割り当てしてから同じコマンドを実行すると、次のように機能します。

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 を検索するようになっているようです。

何か案は?

4

1 に答える 1

2

ああああああ、そして私はそれを理解しました。

変数「badgetype」をリロードする必要がありました

平等のテストの前に、私は付け加えました

@badge.reload

出来上がり。変。

于 2013-01-30T08:29:52.077 に答える