Представьте, что у меня есть приложение, которое использует 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
Этот тестовый файл успешен, но проблема в том, что он «создает» реальные данные. Я не хочу заполнять свой аккаунт фиктивными данными при каждом запуске теста.
Приведенный выше тест возвращает page.body
в виде HTML-документа, он отображает вид выше. Таким образом, успех теста выше возвращает что-то вроде этого:
Tweet has been created successfully.
<ul>
<li>Tweet</li>
<li>My other tweet</li>
<li>My Example Tweet</li>
</ul>
Как видите, это происходит потому, что create перенаправляет на индекс, который выбирает все твиты и повторяет их. Но это вызывает API каждый раз, когда я запускаю тест.
Именно тогда я обнаружил данные о заглушке.
Я использую Пыхтя Билли , чтобы создать заглушку на моих тестах.
В своих тестах я использую это так:
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
По сути, я собираю данные о моем методе создания. И этот тест успешен, но проблема в том, что мои приложения работают не так.
Обычный процесс заключается в том, что он перенаправляет меня в индекс, чтобы проверить страницу, если в ней есть содержимое.
Но после создания заглушки он просто вернет мне JSON, а не документ HTML.
Это то, как делается заглушка, или я делаю что-то не так?