我认为不visiting a url and measuring the speed
属于Page
模型内部,设置速度是,但不是实际计算。所以我会创建一个类lib
,让我可以测量 url 的速度,并改用那个类。我会允许那个类被注入一个存根。
所以像这样的东西,在lib\page_visitor.rb
:
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
变成:
def calculate_page_speed(url)
self.speed = PageVisitor.new.measure_speed(url)
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
可以被认为是一种气味,但在这种情况下,我认为这是测试它的最简单方法。如果你真的想避免它,而不是更改代码(我认为代码没问题,不需要注入PageVisitor
恕我直言),你可以存根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
这应该让你开始。