Тестирование последовательностей запросов взаимодействия

В этом случае лучше использовать переменные @instance и использовать let(:object). Но как написать тест последовательностей вызовов, где каждый шаг требует предыдущего состояния, но не чистого состояния.

Я бы хотел написать такой код:

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  it "request" do
    get "/api/v1/request", {user2}, token(user1)
    expect(...).to ...
  end

  it "confirm" do
    get "/api/v1/confirm", {user1}, token(user2)
    expect(...).to ...
  end
end

Но это не сработает. Он может работать только следующим образом:

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  it "all tests" do
    # request
    get "/api/v1/request", {user2}, token(user1)
    expect(...).to ...
    # confirm
    get "/api/v1/confirm", {user1}, token(user2)
    expect(...).to ...
  end
end

it становится непригодным, а имена тестов становятся комментариями или помещаются в консоль. Подсистема rspec теряет свою цель. Использование переменных @instance - это плохая практика, есть ли какая-либо функция определения типа let, которая не создает новую обычную переменную для каждого теста, но для каждой группы тестов?

Последовательности и api существуют не первый год. Что касается вашей практики тестирования последовательностей?

Ответ 1

В тестах, когда вам нужно подготовить среду для теста, вы делаете это в блоке before. Итак, вот как ваши тесты могут выглядеть как

describe "intearction" do
  let(:user1) { ... }
  let(:user2) { ... }

  describe '#request' do
    it "does something" do
      get "/api/v1/request", {user2}, token(user1)
      expect(...).to ...
    end
  end

  describe '#confirm' do
    context 'request was made before' do
      before { get "/api/v1/request", {user2}, token(user1) }

      it "does something as well" do
        get "/api/v1/confirm", {user1}, token(user2)
        expect(...).to ...
      end
    end
  end
end