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
.
Какие сопоставители включены?
Вот список текущих сопоставителей. Этот список будет расти со временем, и некоторые имена могут измениться, чтобы обеспечить интеграцию с различными средами тестирования.
assert_that 1, aint(2)
assert_that [2], aint(includes_exactly(1))
assert_that "a value", anything
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)
==
).assert_that "my value", equal_to("my value")
dance = Struct.new(:twist).new(2)
assert_that dance, has_attribute(:funk) # атрибут существует
assert_that dance, has_attribute(:funk, equal_to(2)) # атрибут существует со значением
assert_that [1, 2], has_size(2)
assert_that { :a => 1 }, has_size(less_or_equal_to(3))
assert_that [1, 2, 3], includes(2, 3)
assert_that [6, 7, 2], includes(6, greater_than(6))
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))
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))
assert_that 1, is(1)
assert_that 2, is(greater_than(1))
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 )