我是否正确存根数据?
Am I stubbing data correctly?
假设我有一个使用 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
在我的视图文件中:
<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
此测试文件成功,但问题是它 'creates' 真实数据。我不想在每次 运行 测试时用虚拟数据填充我的帐户。
上面的测试 returns page.body
作为一个 HTML 文档,它呈现上面的视图。所以上面的测试成功 returns 是这样的:
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
基本上,我在我的创建方法上存根数据。这个测试用例成功了,但问题是这不是我的应用程序的工作方式。
正常的流程是,如果有内容,它会将我重定向到索引以检查页面。
但是在存根之后它只会 return 我 JSON 而不是 HTML 文档。
这是存根的方式,还是我做错了什么?
Puffing Billy 是一个可编程代理,可用于存根来自浏览器的请求。在您的情况下,您要存根的请求来自您的应用程序而不是浏览器。通常来自您的应用程序的请求将使用 WebMock 之类的东西或通过编写虚假服务来存根。文章 - https://robots.thoughtbot.com/how-to-stub-external-services-in-tests - 很好地总结了来自应用程序内部的存根请求。
另一个可能的选择是,如果您用来与 Twitter 通信的任何库提供它自己的测试模式。
假设我有一个使用 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
在我的视图文件中:
<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
此测试文件成功,但问题是它 'creates' 真实数据。我不想在每次 运行 测试时用虚拟数据填充我的帐户。
上面的测试 returns page.body
作为一个 HTML 文档,它呈现上面的视图。所以上面的测试成功 returns 是这样的:
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
基本上,我在我的创建方法上存根数据。这个测试用例成功了,但问题是这不是我的应用程序的工作方式。
正常的流程是,如果有内容,它会将我重定向到索引以检查页面。
但是在存根之后它只会 return 我 JSON 而不是 HTML 文档。
这是存根的方式,还是我做错了什么?
Puffing Billy 是一个可编程代理,可用于存根来自浏览器的请求。在您的情况下,您要存根的请求来自您的应用程序而不是浏览器。通常来自您的应用程序的请求将使用 WebMock 之类的东西或通过编写虚假服务来存根。文章 - https://robots.thoughtbot.com/how-to-stub-external-services-in-tests - 很好地总结了来自应用程序内部的存根请求。
另一个可能的选择是,如果您用来与 Twitter 通信的任何库提供它自己的测试模式。