【问题标题】:Am I stubbing data correctly?我是否正确地存根数据?
【发布时间】:2019-06-03 18:14:18
【问题描述】:

假设我有一个使用 Twitter API 的应用程序。在我的应用程序中,我只有一个 textarea 和一个按钮,如果我在其中提交表单,它将向我的帐户发送推文。

在我的应用中,我有以下路线:

resources :tweets, :only => [:index, :new, :create]

在我的控制器中,我有:

class TweetsController < ApplicationController
  def index
    @tweets = [JSON RESPONSE FROM API (LIST OF TWEETS)]
  end

  def create
    @tweet = [POST REQUEST TO CREATE A TWEET]

    flash[:notice] = 'Tweet has been created successfully.'

    redirect_to tweets_path
  end
end

在我的视图文件中:

<ul>
 <% @tweets.each do |tweet| %>
  <li><%= tweet %></li>
 <% end %>
</ul>

现在这工作得很好。但是在测试应用程序时,我使用的是 Rspec 和 Capybara。

在我的测试文件中,我有这个代码:

require 'rails_helper'

feature 'User creates' do
  scenario 'a tweet' do
    visit new_tweet_path

    fill_in 'Tweet', :with => 'My Example Tweet'
    click_on 'Submit'

    expect(page).to have_content 'My Example Tweet'
    expect(page).to have_content 'Tweet has been created successfully.'
  end
end

这个测试文件成功了,但问题是它“创建”了真实数据。我不想在运行测试时用虚拟数据填充我的帐户。

上面的测试以 HTML 文档的形式返回 page.body,它呈现上面的视图。所以上面的测试成功返回如下内容:

Tweet has been created successfully.
<ul>
  <li>Tweet</li>
  <li>My other tweet</li>
  <li>My Example Tweet</li>
</ul>

如您所见,这是因为创建重定向到索引,该索引获取所有推文并对其进行迭代。但这会在我每次运行测试时调用 API。

那时我发现了存根数据。

我使用Puffing Billy 在我的测试中创建一个存根。

在我的测试中,我是这样使用它的:

require 'rails_helper'

feature 'User creates' do
  scenario 'a tweet' do
    proxy.stub(tweets_url, :method => :post).and_return(
      :json => {
        "status"=>"OK",
        "message"=>"Tweet has been created successfully.",
        "data"=>{
          "tweet"=>"My Example Tweet",
        }
      }
    )

    visit new_tweet_path

    fill_in 'Tweet', :with => 'My Example Tweet'
    click_on 'Submit'

    expect(page).to have_content 'My Example Tweet'
    expect(page).to have_content 'Tweet has been created successfully.'
  end
end

基本上,我在我的 create 方法中存根数据。这个测试用例成功了,但问题是这不是我的应用程序的工作方式。

正常的过程是它会将我重定向到索引以检查页面是否有内容。

但是在存根之后它只会返回 JSON 而不是 HTML 文档。

这是存根的完成方式,还是我做错了什么?

【问题讨论】:

    标签: ruby-on-rails rspec capybara stub webmock


    【解决方案1】:

    Puffing Billy 是一个可编程代理,可用于存根来自浏览器的请求。在您的情况下,您要存根的请求来自您的应用程序而不是浏览器。通常,来自您的应用程序的请求将使用 WebMock 之类的东西或通过编写虚假服务来存根。这篇文章 - https://robots.thoughtbot.com/how-to-stub-external-services-in-tests - 很好地总结了来自应用程序内部的存根请求。

    另一个可能的选择是,如果您用于与 twitter 通信的任何库都提供它自己的测试模式。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2023-03-30
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2011-04-30
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多