RSpec中的'expect'和'should'之间有区别吗?

时间:2013-08-06 02:12:35

标签: ruby-on-rails rspec

例如,这两个测试:

it "fails to create given a bad player list" do
  Team.new("Random name", bad_players).should raise_error
end

it "fails to create given a bad player list" do
  expect {Team.new("Random name", bad_players)}.to raise_error
end

他们返回不同的输出(第一个失败,而第二个失败)。根据团队模型的内容,我希望传递或失败。

完整的RSpec代码是:

require_relative 'team'

describe "Team" do

  it "has a name" do
    Team.new("Random name").should respond_to(:name)
  end

  it "has a list of players" do
    Team.new("Random name").players.should be_kind_of Array
  end

  it "is favored if it has a celebrity on it"
  it "complains if there is a bad word in the name"

  context "given a bad list of players" do
    let(:bad_players) { {} }

    it "fails to create given a bad player list" do
      expect { Team.new("Random name", bad_players) }.to raise_error
    end
  end

end

我认为'应该'会起作用的原因是因为'it'中的类似语法有一个名称''test。如果事实证明'应该'是不正确的并且'期望......'是正确的,我很想知道何时使用一个与另一个。感谢。

2 个答案:

答案 0 :(得分:5)

引自https://github.com/rspec/rspec-expectations/blob/master/Should.md

  

从开头RSpec::Expectations提供should和   should_not方法来定义对任何对象的期望。在版本中   引入了2.11 expect方法,这种方法现在是定义对象期望的推荐方法。

该文件的下一段描述了实施方面的差异以及为什么expect现在是推荐的方法。

此时,shouldshould_not几乎可以使用expect完成任何操作。有关详细信息和expect用法,请参阅http://rubydoc.info/gems/rspec-expectations/frames

至于您的特定代码,第一个示例失败的原因是错误发生在RSpec有机会参与之前。您仍然可以使用should来检查是否出现错误,但您必须为RSpec提供工作机会。语法为lambda {...}.should raise_error,其中...是您正在测试的代码。

答案 1 :(得分:3)

是的,存在差异

should将验证权限方面的内容是true。它必须用于简单的结果比较。

(1+1).should eq(3-1)

expect接受一个块并验证块的执行是否具有特定效果。在比较执行块之前和之后的情况时必须使用它

expect{ User.new.save }.to change(User, :count).by(1)

尽可能使用should(写起来更容易),expect仅在should无法完成工作时使用{/ 1}}