为什么这个简单的RSpec字符串相等规范失败?

时间:2012-03-19 22:05:36

标签: ruby-on-rails ruby ruby-on-rails-3 rspec

鉴于此课程:

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 个答案:

答案 0 :(得分:4)

您的外describe区块:

describe First do

设置内部示例to be an instance of First的主题。也就是说,您描述的所有it都是First个对象。文本#to_s示例并未指示rspec在对象上调用to_s

由于First.new不等于"Hello World",因此规范失败。

但是,由于rspec确实在对象上调用to_s以在失败描述中输出它,因此“Hello World”会出现在那里。您可以尝试以下操作以确保正在测试字符串转换:

its(:to_s) { should == "Hello World" }

答案 1 :(得分:2)

我从未使用#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