Skip to content

RSpec Начиная с 2.5.0

WARNING

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

Установка

ruby
require "servactory/test_kit/rspec/helpers"
require "servactory/test_kit/rspec/matchers"
ruby
RSpec.configure do |config|
  config.include Servactory::TestKit::Rspec::Helpers
  config.include Servactory::TestKit::Rspec::Matchers

  # ...
end

Хелперы

Хелпер allow_service_as_success!

Предназначен для мока вызова через call! с успешным результатом.

ruby
before do
  allow_service_as_success!(UsersService::Accept)
end
ruby
before do
  allow_service_as_success!(UsersService::Accept) do
    {
      user: user
    }
  end
end

Хелпер allow_service_as_success

Предназначен для мока вызова через call с успешным результатом.

ruby
before do
  allow_service_as_success!(UsersService::Accept)
end
ruby
before do
  allow_service_as_success!(UsersService::Accept) do
    {
      user: user
    }
  end
end

Хелпер allow_service_as_failure!

Предназначен для мока вызова через call! с неудачным результатом.

ruby
before do
  allow_service_as_failure!(UsersService::Accept) do
    ApplicationService::Exceptions::Failure.new(
      message: "Some error"
    )
  end
end

Хелпер allow_service_as_failure

Предназначен для мока вызова через call с неудачным результатом.

ruby
before do
  allow_service_as_failure!(UsersService::Accept) do
    ApplicationService::Exceptions::Failure.new(
      message: "Some error"
    )
  end
end

Опции

Опция with

Методы allow_service_as_success!, allow_service_as_success, allow_service_as_failure! и allow_service_as_failure поддерживают опцию with.

По умолчанию эта опция не требует передачу аргументов сервиса и будет автоматически определять эти данные на основе метода info.

ruby
before do
  allow_service_as_success!(
    UsersService::Accept,
    with: { user: user } 
  )
end
ruby
before do
  allow_service_as_success!(
    UsersService::Accept,
    with: { user: user } 
  ) do
    {
      user: user
    }
  end
end

Матчеры

Матчер have_service_input

Алиас: have_input

type

Проверяет тип инпута. Предназначен для одного значения.

ruby
it do
  expect { perform }.to(
    have_input(:id)
      .type(Integer)
  )
end

types

Проверяет типы инпута. Предназначен для нескольких значений.

ruby
it do
  expect { perform }.to(
    have_input(:ids)
      .types(Integer, String)
  )
end

required

Проверяет обязательность инпута.

ruby
it do
  expect { perform }.to(
    have_input(:id)
      .type(Integer)
      .required
  )
end

optional

Проверяет опциональность инпута.

ruby
it do
  expect { perform }.to(
    have_input(:middle_name)
      .type(String)
      .optional
  )
end

default

Проверяет дефолтное значение инпута.

ruby
it do
  expect { perform }.to(
    have_input(:middle_name)
      .type(String)
      .optional
      .default("<unknown>")
  )
end

consists_of

Проверяет вложенные типы коллекции инпута. Можно указать несколько значений.

ruby
it do
  expect { perform }.to(
    have_input(:ids)
      .type(Array)
      .consists_of(String) { "Input `ids` must be an array of `String`" }
      .required
  )
end

inclusion

Проверяет значения опции inclusion инпута.

ruby
it do
  expect { perform }.to(
    have_input(:event_name)
      .type(String)
      .required
      .inclusion(%w[created rejected approved])
  )
end

must

Проверяет наличие ожидаемого ключа в must инпута. Можно указать несколько значений.

ruby
it do
  expect { perform }.to(
    have_input(:invoice_numbers)
      .type(Array)
      .consists_of(String)
      .required
      .must(:be_6_characters)
  )
end

valid_with

Этот чейн будет пытаться проверить реальное поведение инпута на основе переданных данных.

ruby
subject(:perform) { described_class.call!(**attributes) }

let(:attributes) do
  {
    first_name: first_name,
    middle_name: middle_name,
    last_name: last_name
  }
end

it do
  expect { perform }.to(
    have_input(:first_name)
      .valid_with(attributes)
      .type(String)
      .required
  )
end

Матчер have_service_internal

Алиас: have_internal

type

Проверяет тип внутреннего атрибута. Предназначен для одного значения.

ruby
it do
  expect { perform }.to(
    have_internal(:id)
      .type(Integer)
  )
end

types

Проверяет типы внутреннего атрибута. Предназначен для нескольких значений.

ruby
it do
  expect { perform }.to(
    have_internal(:ids)
      .types(Integer, String)
  )
end

consists_of

Проверяет вложенные типы коллекции внутреннего атрибута. Можно указать несколько значений.

ruby
it do
  expect { perform }.to(
    have_internal(:ids)
      .type(Array)
      .consists_of(String) { "Input `ids` must be an array of `String`" }
  )
end

inclusion

Проверяет значения опции inclusion внутреннего атрибута.

ruby
it do
  expect { perform }.to(
    have_internal(:event_name)
      .type(String)
      .inclusion(%w[created rejected approved])
  )
end

must

Проверяет наличие ожидаемого ключа в must внутреннего атрибута. Можно указать несколько значений.

ruby
it do
  expect { perform }.to(
    have_internal(:invoice_numbers)
      .type(Array)
      .consists_of(String)
      .must(:be_6_characters)
  )
end

Матчер have_service_output

Алиас: have_output

instance_of

Проверяет тип выходящего атрибута.

ruby
it do
  expect(perform).to(
    have_output(:event)
      .instance_of(Event)
  )
end

nested

Указывает на вложенное значение выходящего атрибута.

ruby
it do
  expect(perform).to(
    have_output(:event)
      .nested(:id)
      .contains("14fe213e-1b0a-4a68-bca9-ce082db0f2c6")
  )
end

with

Проверяет значение выходящего атрибута.

ruby
it do
  expect(perform).to(
    have_output(:full_name)
      .contains("John Fitzgerald Kennedy")
  )
end

Матчер be_success_service

ruby
it { expect(perform).to be_success_service }

with_output

ruby
it do
  expect(result.child_result).to(
    be_success_service
      .with_output(:id, "...")
  )
end

with_outputs

ruby
it do
  expect(result.child_result).to(
    be_success_service
      .with_outputs(
        id: "...",
        full_name: "...",
        # ...
      )
  )
end

Матчер be_failure_service

ruby
it { expect(perform).to be_failure_service }
ruby
it "returns expected failure" do
  expect(perform).to(
    be_failure_service
      .with(ApplicationService::Exceptions::Failure)
      .type(:base)
      .message("Some error")
      .meta(nil)
  )
end

with

ruby
it "returns expected failure" do
  expect(perform).to(
    be_failure_service
      .with(ApplicationService::Exceptions::Failure)
  )
end

type

ruby
it "returns expected failure" do
  expect(perform).to(
    be_failure_service
      .type(:base)
  )
end

message

ruby
it "returns expected failure" do
  expect(perform).to(
    be_failure_service
      .message("Some error")
  )
end

meta

ruby
it "returns expected failure" do
  expect(perform).to(
    be_failure_service
      .meta(nil)
  )
end