【问题标题】:Stubbing 3rd party API calls in Rails integration tests在 Rails 集成测试中存根 3rd 方 API 调用
【发布时间】:2016-02-09 22:46:10
【问题描述】:

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

我现在正在编写基于 capybara/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 方式,但似乎更容易阅读/理解存根的工作原理。

【问题讨论】:

  • 你解决了吗?

标签: ruby-on-rails rspec capybara integration-testing webmock


【解决方案1】:

重用存根时,我喜欢将它们放在共享文件中。我也喜欢将它们包装为方法。所以,我的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

当然记得require这个文件在rails_helper.rb:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2019-07-18
    • 2019-08-04
    相关资源
    最近更新 更多