Несколько пользователей в тесте интеграции с рельсами

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

User A does 1
User B does 2
User A does 3
User B does 4
User A does 5
... 

Для этого тестовый код выполняется в случайном порядке; Я не могу написать серию тестов, таких как: test "user A does 1" do ... end, и ожидать, что они будут выполняться последовательно

Итак, как написать интеграционный тест для описанной выше ситуации?

require 'test_helper'

class MyIntegrationTest < ActionController::IntegrationTest

  test "Test interaction between 2 users" do 
    sign_in '[email protected]'
    assert_response :success

    get '/does/1'
    assert_response :success

    sign_out

    sign_in '[email protected]'
    assert_response :success

    get '/does/2'
    assert_response :success

    sign_out

    sign_in '[email protected]'
    assert_response :success

    get '/does/3'
    assert_response :success

    sign_out

    sign_in '[email protected]'
    # ahhhhhhhhhhhhhhhhhhhhhhhhhhh! .....
  end

Имейте в виду, что тестирование контроллера может быть удалено в Rails 5.

https://github.com/rails/rails/issues/18950#issuecomment-77924771

Нашел это в проблемах с рельсами:

https://github.com/rails/rails/issues/22742

person Daniel    schedule 09.01.2016    source источник


Ответы (2)


В интересах всех, кто приходит сюда: по какой-то причине кажется, что соответствующие помощники не задокументированы в текущих руководствах по Rails, но я нашел этот пример из https://guides.rubyonrails.org/v4.1./testing.html

require 'test_helper'



class UserFlowsTest < ActionDispatch::IntegrationTest
  test "login and browse site" do
    # User david logs in
    david = login(:david)
    # User guest logs in
    guest = login(:guest)
 
    # Both are now available in different sessions
    assert_equal 'Welcome david!', david.flash[:notice]
    assert_equal 'Welcome guest!', guest.flash[:notice]
 
    # User david can browse site
    david.browses_site
    # User guest can browse site as well
    guest.browses_site
 
    # Continue with other assertions
  end
 
  private
 
    module CustomDsl
      def browses_site
        get "/products/all"
        assert_response :success
        assert assigns(:products)
      end
    end
 
    def login(user)
      open_session do |sess|
        sess.extend(CustomDsl)
        u = users(user)
        sess.https!
        sess.post "/login", username: u.username, password: u.password
        assert_equal '/welcome', sess.path
        sess.https!(false)
      end
    end
end

Эта техника все еще работала в приложении Rails 5.1.

person rwold    schedule 23.06.2020

По этому URL-адресу есть пример кода:

http://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html
http://guides.rubyonrails.org/testing.html#integration-testing-examples

Этого НЕТ в направляющих по состоянию на 10 января 2016 г.

person Daniel    schedule 10.01.2016