在 Rails 集成测试中存根第三方 API 调用



我定义了一个TwitterAPI类,它与Twitter的API交互。 模块中的方法进行两个单独的 API 调用。 因此,我在TwitterAPI类的单元测试中定义了两个 WebMock stub_request

我现在正在编写基于水豚/rspec 的集成测试。 一些测试场景涉及使用 Twitter API 数据的页面,例如:

feature 'View Twitter feed,' do
  let(:twitter_feed_page)      { TwitterFeedPage.new }
  let(:user)                   { FactoryGirl.create :user }
  scenario "Twitter feed is displayed" do
    login(user)
    twitter_feed_page.load
    expect(twitter_feed_page).to have_text("Test tweet")
    # etc.
  end
end

我希望这些集成测试使用与我的单元测试相同的存根数据。因此,stub_requests将在多个测试之间共享。 我是否应该将我定义的stub_requests移动到我的rails_helper.rb,并具有某种允许特定测试使用存根的标志? 还是我应该将stub_requests复制/粘贴到集成测试本身? 拥有存根请求的多个副本不是执行此操作的 DRY 方法,但似乎更容易阅读/理解存根的工作原理。

重用存根时,我喜欢将它们放在共享文件中。我也喜欢将它们包装为方法。因此,我的spec文件夹中可能有一个名为 stubbing_helper.rb 的文件,如下所示:

# spec/stubbing_helper.rb
def stub_successful_twitter_feed_load
  # a stub goes here
end 
def stub_failed_twitter_feed_load
  # another stub goes here
end

当然,请记住在rails_helper.rbrequire此文件:

# spec/rails_helper.rb
...
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded until this point!
require 'stubbing_helper'
...

然后根据需要调用相应的存根方法:

feature 'View Twitter feed,' do
  let(:twitter_feed_page)      { TwitterFeedPage.new }
  let(:user)                   { FactoryGirl.create :user }
  scenario "Twitter feed is displayed" do
    stub_successful_twitter_feed_load
    login(user)
    twitter_feed_page.load
    expect(twitter_feed_page).to have_text("Test tweet")
    # etc.
  end
end

最新更新