Я правильно записываю данные? - PullRequest
0 голосов
/ 09 января 2019

Представьте, что у меня есть приложение, которое использует 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.

Это то, как делается заглушка, или я делаю что-то не так?

1 Ответ

0 голосов
/ 09 января 2019

Puffing Billy - это программируемый прокси, который можно использовать для блокировки запросов из браузера. В вашем случае запросы на заглушку поступают из вашего приложения, а не из браузера. Как правило, запросы от вашего приложения могут быть отложены с помощью чего-то вроде WebMock или написания поддельного сервиса. Статья - https://robots.thoughtbot.com/how-to-stub-external-services-in-tests - содержит краткое изложение запросов на заглушки внутри вашего приложения.

Еще один потенциальный вариант, если какая-либо библиотека, которую вы используете для связи с твиттером, имеет собственный тестовый режим.

...