我是否正确存根数据?

时间:2019-01-09 01:46:44

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

想象一下,我有一个使用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

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

上面的测试将page.body作为HTML文档返回,它将呈现上面的视图。因此,上面测试的成功返回了以下内容:

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

如您所见,这是因为create重定向到索引,该索引会获取所有tweet并对其进行迭代。但是每次我运行测试时都会调用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文档。

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

1 个答案:

答案 0 :(得分:1)

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

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