1

こんにちは、Rails モデル内に次のようなコードがあります。

class Page < ActiveRecord::Base
  def calculate_page_speed(url)
    browser = Watir::Browser.new :phantomjs
    start = Time.now
    browser.goto url
    finish = Time.now
    self.speed = finish - start
  end
end

テストは次のとおりです。

describe Page do
  context "calculate_page_speed for Page" do
    let(:google) { FactoryGirl.create(:page, url: "http://www.google.com") }

    it "should set the page speed" do
      google.speed.should be_nil
      google.calculate_page_speed
      google.speed.should_not be_nil
    end
  end
end

テスト中に呼び出されないように外部サービスを効果的にスタブするにはどうすればよいですか?

4

2 に答える 2

2

次のようなアプローチがあります。

class Page < ActiveRecord::Base
  def calculate_page_speed(url)
    start = Time.now
    browser.goto url
    finish = Time.now
    self.speed = finish - start
  end

  def browser
    @browser ||= Rails.env.test? ? FakeBrowser.new : Watir.new(:phantomjs)
  end

  class FakeBrowser
    def goto
    end
  end 
end

しかし、ここでは、prod コードにテスト コードがありますが、これはあまり良くありません。


派生した解決策は、予想されるブラウザー クラスを構成に挿入することです。


最後に、スタブすることができます:

Watir::Browser.any_instance.stub(:goto)
于 2014-10-31T09:45:56.893 に答える