2014-10-31 4 views
0

안녕하세요 나는 레일 모델 내부에 다음과 같은 코드가 있습니다레일 :이 외부 서비스 호출을 스텁 및 테스트하는 방법은 무엇입니까?

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 

가 어떻게 효과적으로 테스트 중에 호출하지 않는 외부 서비스를 스텁 수 있습니다 테스트가

여기
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 

입니까?

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 

그러나 여기에서 당신은 크지 않다 자극 코드의 테스트 코드를 가지고 같은 방법이 있습니다

답변

2

.


파생 된 솔루션은 예상되는 브라우저 클래스를 구성에 주입하는 것입니다.

Watir::Browser.any_instance.stub(:goto) 
+0

예 실제로 테스트하기 위해 프로덕션 코드를 변경하는 것을 싫어합니다. 코드의 마지막 줄이 더 재미있을 것 같습니다. – JohnDel

1

내가 입니다 속도를 설정 visiting a url and measuring the speedPage 모델 내부에 속한다고 생각하지 않는다,하지만 실제 계산 :


마지막으로 당신은 단지 물건을 스텁 수 있습니다. 그래서 은 URL의 속도를 측정하고 그 클래스를 대신 사용하는 클래스를 lib에 만들 것입니다. 나는 그 클래스가 스텁을 주입하도록 허용 할 것이다.

그래서 lib\page_visitor.rb에서이 같은 : 당신은 당신의 테스트를 단순화 할 수 있습니다, 그 설정에 따라서

def calculate_page_speed(url) 
    self.speed = PageVisitor.new.measure_speed(url) 
end 

: Page에 당신이를 확인해야

class PageVisitor 

    def initialize(browser = Watir::Browser.new(:phantomjs)) 
    @browser = browser 
    end 

    def measure_speed(url) 
    start = Time.now 
    @browser.goto url 
    finish = Time.now 
    finish - start 
    end 

end 

그리고 당신의 Page이된다 마찬가지로 오른쪽 함수가 호출되고, 마찬가지로 PageVisitor에서 실제로 페이지에 가지 않고도 goto이 호출되는지 확인합니다.

그래서, spec/models/page_spec.rb 쓰기에서 :

let(:google) { FactoryGirl.create(:page, url: "http://www.google.com") } 

it("initial speed is zero") { google.speed.should be_nil } 

describe `calculating the speed` do 
    before do 
    PageVisitor.any_instance.should_receive(:measure_speed).and_return(25) 
    google.calculate_page_speed 
    end 

    it "sets the speed correctly"   
    google.speed.should == 25 
    end 
end 

냄새로 간주하지만,이 경우에 나는 그것을 테스트하는 가장 쉬운 방법이라고 생각 할 수 any_instance 사용. 코드를 변경하는 대신 코드를 변경하지 말고 (imho를 삽입 할 필요가 없다고 생각하는 경우) PageVisitor.new을 스텁하여 PageVisitor을 반환 한 다음 해당 인스턴스에서 measure_speed을 스텁 할 수 있습니다 . 당신의 spec/lib/page_visitor_spec.rb 쓰기에

describe PageVisitor 

    class FakeBrowser 
    def goto(url) 
     sleep 1 
    end 
    end 

    let(:page_visitor) { PageVisitor.new(FakeBrowser.new) } 

    it "measure the speed" do 
    page_visitor.measure_speed.should_not be_nil 
    end 
end 

이것은 당신이 시작할 수 있어야합니다.

+0

감사합니다. 실제로 다른 모델에서도 마찬가지로 calculate_page_speed 메서드를 사용하고 있습니다. – JohnDel