Однострочный RSpec для проверки атрибутов объекта

StackOverflow https://stackoverflow.com/questions/19855496

  •  29-07-2022
  •  | 
  •  

Вопрос

Предположим следующую ситуацию

class A
    attr_accessor :name
    def initialize(name)
        @name = name
    end
end

subject { A.new('John') }

тогда я хотел бы иметь что-нибудь вроде этого

it { should have(:name) eq('John') }

Можно ли это как-то?

Это было полезно?

Решение 2

Да, это возможно, но синтаксис, который вы хотите использовать (с использованием пробелов повсюду), подразумевает, что have(:name) и eq('John') все аргументы применяются к методу should.Поэтому вам придется заранее определить те, которые не могут быть вашей целью.Тем не менее, вы можете использовать пользовательские сопоставления rspec для достижения аналогичной цели:

require 'rspec/expectations'

RSpec::Matchers.define :have do |meth, expected|
  match do |actual|
    actual.send(meth) == expected
  end
end

Это дает вам следующий синтаксис:

it { should have(:name, 'John') }

Кроме того, вы можете использовать its

its(:name){ should eq('John') }

Другие советы

Метод его был удален из RSpec https://gist.github.com/myronmarston/4503509.Вместо этого вы сможете сделать один лайнер следующим образом:

it { is_expected.to have_attributes(name: 'John') }
person = Person.new('Jim', 32)

expect(person).to have_attributes(name: 'Jim', age: 32)

ссылка: rspec имеет атрибуты-сопоставитель

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top