Ruby on rails 我是否正确地存根了数据?

Ruby on rails 我是否正确地存根了数据?,ruby-on-rails,rspec,capybara,stub,webmock,Ruby On Rails,Rspec,Capybara,Stub,Webmock,假设我有一个使用Twitter API的应用程序。在我的应用程序中,我只有一个文本区和一个按钮,如果我提交表单,它将推送到我的帐户 在我的应用程序中,我有以下路线: resources :tweets, :only => [:index, :new, :create] 在我的控制器中,我有: class TweetsController < ApplicationController def index @tweets = [JSON RESPONSE FROM API

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

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

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
此测试文件成功,但问题是它“创建”了真实数据。我不想在每次运行测试时用虚拟数据填充我的帐户

上面的测试返回
page.body
作为HTML文档,它呈现上面的视图。因此,上述测试的成功返回如下结果:

Tweet has been created successfully.
<ul>
  <li>Tweet</li>
  <li>My other tweet</li>
  <li>My Example Tweet</li>
</ul>
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文档


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

Puffing Billy是一个可编程代理,可用于存根来自浏览器的请求。在您的情况下,您希望存根的请求来自您的应用程序,而不是浏览器。一般来说,来自应用程序的请求会使用WebMock之类的工具或编写虚假服务进行存根。这篇文章很好地总结了应用程序内部的存根请求

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

Tweet has been created successfully.
<ul>
  <li>Tweet</li>
  <li>My other tweet</li>
  <li>My Example Tweet</li>
</ul>
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