Question

Supposons la situation suivre la situation

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

subject { A.new('John') }

alors j'aimerais avoir un one-liner comme ça

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

Est-il possible d'une manière ou d'une autre?

Était-ce utile?

La solution 2

Oui, c'est possible, mais la syntaxe que vous souhaitez utiliser (en utilisant des espaces partout) a l'implication que have(:name) et eq('John') tous les arguments sont-ils appliqués à la méthode should. Vous devriez donc prédéfinir ceux qui ne peuvent pas être votre objectif. Cela dit, vous pouvez utiliser Matchés personnalisés RSPEC Pour atteindre un objectif similaire:

require 'rspec/expectations'

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

Cela vous donne la syntaxe suivante:

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

Aussi, vous pouvez utiliser its

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

Autres conseils

Méthode son a été supprimé de RSpec https://gist.github.com/myronmarson/4503509. Au lieu de cela, vous devriez être en mesure de faire le seul liner de cette façon:

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

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

référence: RSpec Have-Attributes-Matcher

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top