Pregunta

Supongamos que la siguiente situación

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

subject { A.new('John') }

Entonces me gustaría tener una línea de una sola como esta

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

¿Es posible de alguna manera?

¿Fue útil?

Solución 2

Sí, es posible, pero la sintaxis que desea usar (usando espacios en todas partes) tiene la implicación de que have(:name) y eq('John') se aplican todos los argumentos al método should. Entonces tendrías que predefinirlos, que no pueden ser tu objetivo. Dicho esto, puedes usar RSPEC Custom Matchers Para lograr un objetivo similar:

require 'rspec/expectations'

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

Esto te da la siguiente sintaxis:

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

Además, puedes usar its

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

Otros consejos

Método su fue eliminado de RSPEC https://gist.github.com/myronmarston/4503509. En su lugar, debería poder hacer el revestimiento de esta manera:

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

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

referencia: RSPEC Have-Atributes-Matcher

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top