0

私は、Ruby と RSpec の両方に慣れていないと言わざるを得ません。とにかく、RSpec スクリプトを 1 つ完成させましたが、リファクタリング後に失敗しました。元の作業バージョンは次のとおりです。

describe Site do
  browser = Watir::Browser.new :ie
  site    = Site.new(browser, "http://localhost:8080/site")

  it "can navigate to any page at the site" do
    site.pages_names.each do |page_name|
      site.goto(page_name)
      site.actual_page.name.should eq page_name
    end
  end
  browser.close
end

これが変更されたバージョンです。テスト中にアクセスしたすべてのページを報告したかったのです。

describe Site do
  browser = Watir::Browser.new :ie
  site    = Site.new(browser, "http://localhost:8080/site")

  site.pages_names.each do |page_name|
    it "can navigate to #{page_name}" do
      site.goto(page_name)
      site.actual_page.name.should eq page_name
    end
  end
  browser.close
end

後者の問題は、「it」メソッドに関連付けられたコード ブロック内でサイトが nil と評価されることです。しかし、私がこれをしたとき:

...
s = site
it "can navigate to #{page_name}" do
  s.goto(page_name)
  s.actual_page.name.should eq page_name
end
...

nilの問題はなくなりましたが、「ブラウザが閉じられました」という理由でテストが失敗しましたどうやら、非常に基本的なRubyの知識が欠けているようです-変更されたスクリプトでブラウザの参照が正しく機能しないためです。どこで私は間違えましたか?これを機能させるには、どのようなリファクタリングを適用する必要がありますか? ご協力いただきありがとうございます!

4

2 に答える 2

0

Site と Watir の偽のクラスを使用して、上記のコードを複製しました。それは完璧に機能しました。私の唯一の結論は、問題は上記のクラスのいずれかにあるに違いないということです。Site インスタンスは、最初の作業バージョンでは 1 つのページのみにアクセスする必要がありましたが、非作業バージョンでは複数のページにアクセスする必要があることに気付きました。インスタンス内で発生するミューテーションに関連する問題がある可能性があります。

これが違いを生むかどうかを確認してください:

describe Site do
    uri = "http://localhost:8080/site" 
    browser = Watir::Browser.new :ie 
    page_names = Site.new(browser, uri).page_names 

    before(:each) { @site = Site.new(browser, uri) }
    after(:all) { browser.close }

    pages_names.each do |page_name|
      it "can navigate to #{page_name}" do
        @site.goto(page_name)
        @site.actual_page.name.should eq page_name
      end
    end  
  end
于 2012-12-30T22:52:01.690 に答える
0

多くの Ruby プログラムと同様に、RSpec には 2 つの実行時段階があることを理解することが重要です。

  1. 最初の段階で、RSpec は各スペック ファイルをロードし、各ブロックdescribecontextブロックを実行します。この段階では、コードの実行によってサンプルやフックなどが定義されます。ただし、この段階ではサンプルやフックは実行されません。
  2. RSpec がスペック ファイルのロードを完了すると (そしてすべての例が定義されると)、それらを実行します。

だから...あなたの例をより単純な形に切り詰めると、ここにあなたが得たものがあります:

describe Site do
  browser = Watir::Browser.new :ie

  it 'does something with the browser' do
    # do something with the browser
  end

  browser.close
end

視覚的には、ブラウザー インスタンスがインスタンス化され、例で使用されてから閉じられているように見えますが、実際には次のようになります。

  1. ブラウザ インスタンスがインスタンス化されている
  2. 例は定義されています (ただし、実行されていません)
  3. ブラウザが閉じられました
  4. (後で、すべての例が定義された後...)例が実行されます

O.Powell の回答が示すように、after(:all)フックでブラウザーを閉じて、このサンプル グループのすべての例が実行されるまで終了を遅らせることができます。そうは言っても、例の定義時にブラウザー インスタンスが本当に必要かどうかは疑問です。一般に、サンプルの定義段階ではなく、サンプルの実行中にリソース (ブラウザー インスタンスなど) が必要になったときに、リソース (ブラウザー インスタンスなど) を遅延して作成することをお勧めします。

于 2012-12-31T05:19:33.977 に答える