我正在编写一个规范来验证我的Video
模型是否会在创建vimeo视频时为其创建合适的缩略图。它看起来像这样:
it "creates thumbnail url" do
vimeo_url = "http://player.vimeo.com/video/12345"
vid = Factory.build(:video, video_url:vimeo_url)
# thumbnail created when saved
vid.save!
expect do
URI.parse(vid.thumbnail_url)
end.to_not raise_error
end
问题是我的测试非常慢,因为它必须打到vimeo.com。所以我试图存根调用服务器的方法。所以有两个问题:
1)这是存根的正确方法/时间
2)如果是,我该如何存根?在我的Video
模型中,我有一个名为get_vimeo_thumbnail()
的方法可以访问vimeo.com。我想要存根那个方法。但是,如果在我的规范中{I} vid.stub(:get_vimeo_thumbnail).and_return("http://someurl.com")
它不起作用。当我运行测试时,它仍然会访问vimeo.com。
答案 0 :(得分:2)
VCR gem可能值得考虑。它会在您第一次运行它时触及真实的Web服务并记录响应,以便下次运行测试时可以重放它(使后续测试快速进行)。
如果您在stub
之前致电save!
,我发现您正在拨打的存根电话有任何问题。
答案 1 :(得分:0)
我也是第二次使用'vcr'宝石。
还有关于VCR的Railscast的(专业)剧集: http://railscasts.com/episodes/291-testing-with-vcr
VCR可用于将所有传出的Web服务调用记录到“磁带”(固定装置)中,这些磁带将在再次运行测试时重放。所以你得到了初始的“真实世界”响应,但不会再点击远程api了。
当本地没有可用的记录响应时,它还可以选择执行“按需”请求,还可以发出明确的“实时”请求。
您可以而且应该在实时终端再次运行测试以进行验证。