Как я могу параметризовать тесты RSpec, чтобы я мог тестировать одно и то же поведение в слегка разных условиях - PullRequest
0 голосов
/ 29 августа 2010

Я внедряю сервис, который имеет несколько различных способов доступа к нему:

  • Использование простых параметров запроса
  • С параметрами, закодированными как объект Javascript

Для некоторых вызовов поддерживаются как GET, так и POST, причем POST используется, когда в службу отправляется большое количество данных.

Каков наилучший способ структурировать мои тесты RSpec, чтобы избежать ненужного повторения кода, позволяющего мне каждый раз выполнять одни и те же базовые утверждения?

Я уже использую shared_examples для захвата некоторых тестов комментариев для таких вещей, как код ответа, mimetype и т. Д. Но мне интересно, есть ли другие варианты, особенно когда я хочу вызвать службу, используя все методы запроса И диапазон ожидаемых входов и выходов.

1 Ответ

5 голосов
/ 29 августа 2010

Способ, которым я сделал бы это в этом случае, состоит в том, чтобы указать запрос как лямбда, который его выполняет.Таким образом, я могу ссылаться на него в моих общих спецификациях и устанавливать разные для каждого типа запроса.

Мне нравится использовать блоки rspec description, когда оно устанавливает ожидание, в этом случае используется конкретный метод запроса,Все это будет выглядеть примерно так:

describe FooController do
  shared_examples_for "any request" do
    it "assigns foo" do
      @request.call
      assigns[:foo].should ==  "bar"
    end

    it "does not change the number of bars" do
      @request.should_not change(Bar, :count)
    end
  end

  context "using GET" do
    before do
      @request = lambda { get "index" }
    end

    it_should_behave_like "any request"
  end
end

Еще более чистый способ - использовать конструкцию let, хотя для новичка это может быть слишком глубоко в магии rSpec:

describe FooController do
  shared_examples_for "any request" do
    it "assigns foo" do
      request.call
      assigns[:foo].should ==  "bar"
    end

    it "does not change the number of bars" do
      request.should_not change(Bar, :count)
    end
  end

  context "using GET" do
    let(:request) { lambda { get "index" } }

    it_should_behave_like "any request"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...