0

みんな!

これがバグなのか、私が気付いていないのかはわかりませんが、別のデータベースを使用して、Rails 内で AR テストで joins() をテストしようとすると、うまくいきません。開発モード、コンソールでは動作するようですが、テストでは動作しません。だから私のテストは失敗します。:(

ここで何か見逃した場合はお知らせください。または、これがバグであることをテストして確認するのを手伝ってください。

わかりましたので、アイデアは次のとおりです。2 つのデータベースがあります。そして、データベースごとに異なるモデルのセットがあります。私の例では、両方のデータベースにユーザーとオフィスがあるとします。したがって、私のYMLファイルは次のとおりです。

common: &common
  username: root
  password: 
  host: 127.0.0.1
  encoding: utf8
  adapter: mysql2

development:
  <<: *common
  database: scopetest_devel

test: &test
  <<: *common
  database: scopetest_test

other_development:
  <<: *common
  database: othertest_devel

other_test: &other_test
  <<: *common
  database: othertest_test

そして、これが私のテストのクラスです

class User < ActiveRecord::Base

  attr_accessible :name, :office_id, :office
  belongs_to :office

end

class Office < ActiveRecord::Base

  attr_accessible :name
  has_many :users

end

class AnotherUser < ActiveRecord::Base

  establish_connection "other_#{Rails.env}"
  self.table_name = "users"

  attr_accessible :name, :office_id, :office
  belongs_to :office, class_name: "AnotherOffice"

end

class AnotherOffice < ActiveRecord::Base

  establish_connection "other_#{Rails.env}"
  self.table_name = "offices"

  attr_accessible :name
  has_many :users, class_name: "AnotherUser"

end

ご覧のとおり、それらは同一です。それらが属するテーブルとデータベース接続を除いて。

さて、これは私のテストファイルです:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "scoping works" do
    office = Office.create!(name: 'My Office')
    user = User.create!(office: office, name: 'John Doe')
    assert_equal 1, User.joins(:office).count
  end

  test "another db scoping doesnt" do 
    office = AnotherOffice.create!(name: 'My Office 2')
    user = AnotherUser.create!(office: office, name: 'John Doe')
    assert_equal 1, AnotherUser.joins(:office).count
  end
end

さて、驚くべきことに (あなたにはそうではないかもしれませんが)、最初のテストはパスします。2番目は失敗します。ただし、コンソールでは、これらのモデルを作成して joins() を実行すると機能します。基本的に、テスト モードで別のデータベースで結合を使用するスコープは、カウントで 0 を返します。さて、これはバグですか?:( 試してみたい方も大歓迎です!

これは:

レール 3.2.11 ルビー 1.9.3-p194

Gemfile.lock:

GEM
  remote: https://rubygems.org/
  specs:
    actionmailer (3.2.11)
      actionpack (= 3.2.11)
      mail (~> 2.4.4)
    actionpack (3.2.11)
      activemodel (= 3.2.11)
      activesupport (= 3.2.11)
      builder (~> 3.0.0)
      erubis (~> 2.7.0)
      journey (~> 1.0.4)
      rack (~> 1.4.0)
      rack-cache (~> 1.2)
      rack-test (~> 0.6.1)
      sprockets (~> 2.2.1)
    activemodel (3.2.11)
      activesupport (= 3.2.11)
      builder (~> 3.0.0)
    activerecord (3.2.11)
      activemodel (= 3.2.11)
      activesupport (= 3.2.11)
      arel (~> 3.0.2)
      tzinfo (~> 0.3.29)
    activeresource (3.2.11)
      activemodel (= 3.2.11)
      activesupport (= 3.2.11)
    activesupport (3.2.11)
      i18n (~> 0.6)
      multi_json (~> 1.0)
    arel (3.0.2)
    builder (3.0.4)
    coffee-rails (3.2.2)
      coffee-script (>= 2.2.0)
      railties (~> 3.2.0)
    coffee-script (2.2.0)
      coffee-script-source
      execjs
    coffee-script-source (1.4.0)
    erubis (2.7.0)
    execjs (1.4.0)
      multi_json (~> 1.0)
    hike (1.2.1)
    i18n (0.6.1)
    journey (1.0.4)
    jquery-rails (2.2.0)
      railties (>= 3.0, < 5.0)
      thor (>= 0.14, < 2.0)
    json (1.7.6)
    mail (2.4.4)
      i18n (>= 0.4.0)
      mime-types (~> 1.16)
      treetop (~> 1.4.8)
    mime-types (1.19)
    multi_json (1.5.0)
    mysql2 (0.3.11)
    polyglot (0.3.3)
    rack (1.4.4)
    rack-cache (1.2)
      rack (>= 0.4)
    rack-ssl (1.3.3)
      rack
    rack-test (0.6.2)
      rack (>= 1.0)
    rails (3.2.11)
      actionmailer (= 3.2.11)
      actionpack (= 3.2.11)
      activerecord (= 3.2.11)
      activeresource (= 3.2.11)
      activesupport (= 3.2.11)
      bundler (~> 1.0)
      railties (= 3.2.11)
    railties (3.2.11)
      actionpack (= 3.2.11)
      activesupport (= 3.2.11)
      rack-ssl (~> 1.3.2)
      rake (>= 0.8.7)
      rdoc (~> 3.4)
      thor (>= 0.14.6, < 2.0)
    rake (10.0.3)
    rdoc (3.12)
      json (~> 1.4)
    sass (3.2.5)
    sass-rails (3.2.6)
      railties (~> 3.2.0)
      sass (>= 3.1.10)
      tilt (~> 1.3)
    sprockets (2.2.2)
      hike (~> 1.2)
      multi_json (~> 1.0)
      rack (~> 1.0)
      tilt (~> 1.1, != 1.3.0)
    thor (0.17.0)
    tilt (1.3.3)
    treetop (1.4.12)
      polyglot
      polyglot (>= 0.3.1)
    tzinfo (0.3.35)
    uglifier (1.3.0)
      execjs (>= 0.3.0)
      multi_json (~> 1.0, >= 1.0.2)

PLATFORMS
  ruby

DEPENDENCIES
  coffee-rails (~> 3.2.1)
  jquery-rails
  mysql2
  rails (= 3.2.11)
  sass-rails (~> 3.2.3)
  uglifier (>= 1.0.3)
4

1 に答える 1

4

テスト構成を確認してください。デフォルトでは、テストはロールバックされる SQL トランザクション内で実行されると思います。トランザクションは、コミットされるまでデータベース接続に対してローカルになります。

なぜこれがあなたの問題を引き起こしているのですか? 1 つのデータベースに (トランザクションで) 追加されたレコードがあり、別の接続から (2 番目の DB アダプターを介して) そのデータを読み取ろうとしていますが、トランザクションがコミットされていないため、このデータはまだ表示されません。

コンソールで同じコードを実行すると、トランザクションにラップされず、すぐにコミットされて使用可能になります。

テストを編集して、このテストのトランザクションを無効にすることができます。

class UserTest < ActiveSupport::TestCase
  self.use_transactional_fixtures = false

  ...
于 2013-02-01T21:35:03.797 に答える