Pergunta

Vamos assumir a seguinte situação

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

subject { A.new('John') }

Então eu gostaria de ter uma liner como esta

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

É possível de alguma forma?

Foi útil?

Solução 2

Sim, é possível, mas a sintaxe que você deseja usar (usando espaços em todos os lugares) tem a implicação que have(:name) e eq('John') são todos os argumentos aplicados ao método should. Então você teria que predefinir aqueles, o que não pode ser seu objetivo. Dito isto, você pode usar RSPEC Matcas personalizados Para atingir um objetivo semelhante:

require 'rspec/expectations'

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

Isso fornece a seguinte sintaxe:

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

Além disso, você pode usar its

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

Outras dicas

Método Está foi removido do RSPEC https://gist.github.com/myronmarston/4503509. Em vez disso, você deve poder fazer o revestimento da seguinte maneira:

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

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

referência: RSPEC tem-attributes-Matcher

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top