1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-ramcrest-ruby

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 23:40 9f98b15

Ramcrest: Ruby-порт Hamcrest

Hamcrest — это мощный набор классов и функций, которые позволяют создавать сложные выражения соответствия. Сопоставители предоставляют полезные описания того, что они пытаются сопоставить, а также описание того, почему конкретный объект не соответствует (описание несоответствия).

Тесты для различных сопоставителей должны служить отличными примерами использования, поскольку каждый сопоставитель фактически тестируется с использованием фреймворка Ramcrest.

Существуют интеграции в MiniTest через assert_that(actual, matcher) и в RSpec 2.11 через expect(actual).that matcher.

Как использовать?

В тестах необходимо выполнить следующее:

require 'ramcrest'

Это позволит включить все базовые сопоставители Ramcrest и предоставит новое утверждение assert_that(subject, matcher) для ваших тестов MiniTest. После загрузки сопоставителей вы можете теперь включить их в свои тесты и начать сопоставление!

describe My::Funky::Class do
  include Ramcrest::HasAttribute
  include Ramcrest::IncludesExactly

  it "only knows the funky chicken by default" do
    assert_that My::Funky::Class.new, has_attribute(:dances, includes_exactly(:funky_chicken))
  end
end

Этот код соответствует объекту, который имеет атрибут (на самом деле просто метод без аргументов) с именем dances, где результатом вызова этого метода является Enumerable, который включает только символ :funky_chicken.

Какие сопоставители включены?

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

  • Ramcrest::Aint — логическое отрицание.
assert_that 1, aint(2)
assert_that [2], aint(includes_exactly(1))
  • Ramcrest::Anything — всё в порядке!
assert_that "a value", anything
  • Ramcrest::Comparable — сопоставители для сравнений порядка.
assert_that 1, greater_than(0)
assert_that 2, less_than(3)
assert_that 3, greater_or_equal_to(3)
assert_that 4, less_or_equal_to(4)
  • Ramcrest::EqualTo — равенство (через ==).
assert_that "my value", equal_to("my value")
  • Ramcrest::HasAttribute — сопоставление атрибутов объекта.
dance = Struct.new(:twist).new(2)
assert_that dance, has_attribute(:funk) # атрибут существует
assert_that dance, has_attribute(:funk, equal_to(2)) # атрибут существует со значением
  • Ramcrest::HasSize — размер коллекции.
assert_that [1, 2], has_size(2)
assert_that { :a => 1 }, has_size(less_or_equal_to(3))
  • Ramcrest::Includes — включение перечислимого.
assert_that [1, 2, 3], includes(2, 3)
assert_that [6, 7, 2], includes(6, greater_than(6))
  • Ramcrest::IncludesExactly — равенство перечислимых.
assert_that [1, 2, 3], includes_exactly(1, 2, 3)
assert_that [3, 2, 1], aint(includes_exactly(1, 2, 3))
assert_that [1], aint(includes_exactly(1, 2))
  • Ramcrest::IncludesInAnyOrderExactly — множество равенства перечислимых.
assert_that [2, 1, 3], includes_in_any_order_exactly(1, 2, 3)
assert_that [1, 3, 4], aint(includes_in_any_order_exactly(1, 3))
  • Ramcrest::Is — синтаксический сахар для равенства.
assert_that 1, is(1)
assert_that 2, is(greater_than(1))
  • Ramcrest::SuchThat — специальные сопоставители.
assert_that "my string", such_that do |value| 
  value =~ /string/ ? success : mismatch("didn't contain 'string'")
end

Написание собственных сопоставителей

Самый простой способ начать писать собственные сопоставители — просто создать специальные сопоставители с помощью such_that и связанных результатов сопоставления. Например, чтобы собрать сопоставитель для определённого типа, который имеет два свойства, вы можете просто сделать следующее:

def a_token(with_attributes)
  name = has_attribute(:name, equal_to(with_attributes[:named]))
  string = has_attribute(:string, equal_to(with_attributes[:string]))
  description = "a token named"
``` ```
with_attributes[:named]> с строкой <with_attributes[:string]>>

such_that(description) do |actual|
  name.matches?(actual).and_also { string.matches?(actual) }
end

Использование such_that должно позволить вам написать любой сопоставитель, который вы хотите простым и понятным способом. Если вы переросли эти типы сопоставителей и хотите перейти к гораздо более широким возможностям, то вам просто нужно реализовать класс с двумя методами: matches? (actual) и descriptionf. Метод matches? должен возвращать либо success, либо mismatch (description).

class AToken
  include Ramcrest::Matcher

  def initialize(name)
    @matchers = [Ramcrest::HasAttribute.has_attribute(:name, equal_to(name))]
  end

  def with_string(string)
    @matchers << Ramcrest::HasAttribute.has_attribute(:string, equal_to(string))
    self
  end

  def matches?(actual)
    @matchers.
      collect { |matcher| matcher.matches?(actual) }.
      find(method(:success)) { |result| !result.matched? }
  end

  def description
    "a token that #{@matchers.collect(&:description).join(' and ')}"
  end
end

def a_token_named(name)
  AToken.new(name)
end

assert_that something, is(a_token_named("foo").with_string("bar"))
assert_that something_else, is(a_token_named("baz"))

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-ramcrest-ruby.git
git@api.gitlife.ru:oschina-mirror/mirrors-ramcrest-ruby.git
oschina-mirror
mirrors-ramcrest-ruby
mirrors-ramcrest-ruby
master