4

ActiveRecord を使用して Ruby on Rails 2.3 で RSpec テストを実行すると、データベースはbefore :all各サンプル (itブロック) の後にブロックの後の状態にロールバックされます。

ただし、オブジェクトのライフサイクルを指定したいと考えています。これは、多数の例を 1 つずつ調べ、状態を変更し、事後条件をテストすることを意味します。これは、ロールバック動作では不可能です。

明確にするために:

describe MyModel
  before :all { @thing = MyModel.create }

  it "should be settable" do
    lambda { @thing.a_number = 42 }.should_not raise_exception
  end

  it "should remember things" do
    @thing.a_number.should == 42
    # this fails because the database was rolled back ☹
  end
end

例で行われた変更を保持する方法はありますか?

4

2 に答える 2

3

私は正規性に同意します。この場合、2 つのアサーションを含む単一の仕様を使用したほうがよいようです。

たとえば、Capybara と Selenium を使用した高レベルのテストでは、use_transactional_fixtures構成オプションを使用できます。あなたはこれを置くことができます

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end
于 2011-09-14T13:21:12.990 に答える
0

まあ、それはあなたがやろうとしていることに依存します。ライフサイクル (時間の経過とともに発生する一連のこと) をテストしている場合、それは統合テストの領域であり、Cucumber などのツールでさらに構築できます。コードのビット。

技術的には、複数のステートメントを使用して長い仕様テストを単純に作成することは可能で.shouldあり、それらすべてが合格する限り、記述している種類のテストを効果的に取得できます。ただし、私の経験では、どのような仕様が提供されるように設計されているかは、実際にはそうではありません。

私が言いたいのは、ロールバックを防ごうとするなということだと思います。構築しようとしている種類のテストを実行するように設計されたツールを使用するか、複数の.shouldステートメントを含むより長いテストを記述します。

于 2011-09-14T13:12:33.610 に答える