Frage

Nehmen wir die folgende Situation an

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

subject { A.new('John') }

Dann würde ich gerne einen solchen One-Liner haben

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

Ist es irgendwie möglich?

War es hilfreich?

Lösung 2

Ja, es ist möglich, aber die Syntax, die Sie verwenden möchten (überall mit Leerzeichen) have(:name) und eq('John') sind alle Argumente auf die Methode angewendet should. Sie müssten diese also vorbestimmen, was nicht Ihr Ziel sein kann. Das heißt, Sie können verwenden RSPEC Custom Matcher Ein ähnliches Ziel zu erreichen:

require 'rspec/expectations'

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

Dies gibt Ihnen die folgende Syntax:

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

Sie können auch verwenden its

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

Andere Tipps

Methode es ist wurde aus RSPEC entfernt https://gist.github.com/myronmarston/4503509. Stattdessen sollten Sie in der Lage sein, den einen Liner auf diese Weise zu machen:

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

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

Hinweis: RSPEC HAUS-ATTRIBUTEMATTER

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top