Почему эта простая спецификация равенства строк в RSpec не работает? - PullRequest
2 голосов
/ 20 марта 2012

Учитывая этот класс:

class First
  def to_s ; "Hello World" ; end
end

и эту спецификацию:

require 'first'

describe First do
  describe "#to_s" do
    it { should == "Hello World" }
  end
end

Я получаю:

Failures:

  1) First#to_s 
     Failure/Error: it { should == "Hello World" }
       expected: "Hello World"
            got: Hello World (using ==)
       Diff:
       @@ -1,2 +1,2 @@
       -"Hello World"
       +Hello World
     # ./spec/first_spec.rb:5:in `block (3 levels) in <top (required)>'

Но я ожидаю, что это пройдет.Мои вопросы:

  • Как будет выглядеть проходная спецификация?
  • Почему эта спецификация не проходит, в частности?

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Ваш внешний describe блок:

describe First do

устанавливает предмет внутренних примеров как экземпляр First. То есть все описанные вами it будут объектами First. Текстовый #to_s пример не указывает rspec на вызов to_s для объекта.

Поскольку First.new не равен "Hello World", спецификация не выполняется.

Однако, поскольку rspec вызывает to_s объекта для вывода его в описании ошибки, там появляется «Hello World». Вы можете попробовать следующее, чтобы убедиться, что преобразование строки проверяется:

its(:to_s) { should == "Hello World" }
2 голосов
/ 20 марта 2012

Я никогда не использовал #method_name, чтобы автоматически оценить результат. Я предпочитаю многословие, чтобы быть уверенным в том, что я делаю.

Как правило, я выбираю один из них:

describe First do
  specify { First.new.to_s.should == "Hello World" }
end

Или:

describe First do
  describe "#to_s" do
    subject { First.new.to_s }
    it { should == "Hello World" }
  end
end

Или:

describe First do
  describe "#to_s" do
    let(:result) { First.new.to_s }
    specify { result.should == "Hello World" }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...