0

私は現在プロジェクトに取り組んでおり、テストを分離テストに移行し始めました (レールに依存せず、スタブとモックを使用します)。問題は、現在のすべてのテストが分離されるまで、分離されたテストと一緒にテストを実行する必要があることです。これにより、Rails 環境が開始されます。

問題は、分離されたテストで偽のクラス (class Foo; end;) が存在する場合に発生します。これにより、残りのテストで元のクラスがオーバーライドされます。

例: foo_spec.rb には、次の行があります。

class Bar; end;

これは、次の分離されていないテストで Bar クラスをオーバーライドし、多くの失敗を引き起こします。

これを取り除くために私が考えることができる2つのアプローチがあります:-テストがrails envで実行されるときに偽のクラスをコメントアウトする-分離されたテストを別のフォルダーに入れ、残りから分離して実行します(これにより、より多くの検出)

これに対処するためのより良い方法を考えてもらえますか?

4

2 に答える 2

0

それが正しいかどうかはわかりませんが、実際には、そのようなコンテキストダミーの手動で作成されたダミークラスを定数に割り当てないことになります。

それ以外の:

#no
class Foo
   #something
end

その代わり:

foo = Class.new do
  #stuff
end

そして、あなたはあなたの心のコンテンツにfoo.newまたはfoo.class_methodをすることができます。@fooにもある可能性があります。ただし、通常のクラス定義のように定数Fooに割り当てるのではなく、「匿名」クラスを作成して、必要な領域内にスコープを設定した通常の変数に割り当てます。

注:これがrspecで物事を行うための「正しい」方法であると言っているわけではありません。正しいことを知っているとは決して感じません。正しいことは、このようなクラスをまったく作成しないか、使用することかもしれません。私が理解していない奇妙なファクトリーガールのことか何か。しかし、特定のテストまたはブロックの範囲に合わせて「ダミー」型クラスを作成する必要がある場合は、それを実行します。

于 2012-03-22T15:47:13.767 に答える
0

私たちはrspecを使用しており(何も変更しないでください)、envとすべての醜いものをロードしているspec独自のファイルとともにレール仕様を配置しています。spec_helper.rb

フォルダーには、spec_fastレールなしで実行できるすべての仕様があり、独立したフォルダーのみをロードする独自の仕様ヘルパーがありlibます。

ci-server では、両方の spec フォルダーを別のタスクで実行します。

if Rails.env.test?
  require 'rspec/core/rake_task'
  require 'ci/reporter/rake/rspec'

  RSpec::Core::RakeTask.new(:all_fast) do |t|
    t.pattern = 'spec_fast/**/*_spec.rb'
  end

  RSpec::Core::RakeTask.new(:all_slow) do |t|
    t.pattern = 'spec/**/*_spec.rb'
  end

  task :all => ["ci:setup:rspec", :all_fast, :all_slow]
end

spec/railsそれらをandのように別のサブフォルダーに入れることもできるはずspec/fastですが、スペックファイルで多くのパス変更を行うことを意味するため、試しませんでした。

于 2012-03-22T14:54:41.643 に答える