7

例如,这两个测试:

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

我认为'应该'会起作用的原因是因为'它“有一个名字”'测试中的类似语法。如果事实证明“应该”是不正确的,而“期望...到”是正确的,我很想知道何时使用一个与另一个。谢谢。

4

2 回答 2

9

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

从一开始就RSpec::Expectations提供定义对任何对象的期望的方法shouldshould_not在 2.11 版本expect中引入了方法,这是现在推荐的定义对象期望的方法。

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

在这一点上,几乎所有你可以做的事情shouldshould_not可以做的事情expect。有关详细信息和用法,请参阅http://rubydoc.info/gems/rspec-expectations/frames 。expect

至于您的特定代码,第一个示例失败的原因是错误发生在 RSpec 有机会参与之前。你仍然可以使用它should来检查是否引发了错误,但你必须给 RSpec 一个工作的机会。语法是您正在测试的代码lambda {...}.should raise_error所在的位置。...

于 2013-08-06T02:37:20.627 回答
1

a是的,有区别

should将验证右侧的内容是true. 它必须用于简单的结果比较。

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

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

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

should尽可能使用(它更容易编写)并且expect仅在should无法完成工作时使用

于 2013-08-06T02:29:21.933 回答