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

Ric*_*mas 3 rspec ruby-on-rails

例如,这两个测试:

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

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

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

完整的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
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*vin 5

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

从一开始RSpec::Expectations提供shouldshould_not方法来定义任何物体上的期望.在2.11版本expect中引入了一种方法,该方法现在是定义对象期望的推荐方法.

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

在这一点上,相当多的东西,你可以用做should并且should_not是可以做到的expect.有关详细信息和用法,请参见http://rubydoc.info/gems/rspec-expectations/framesexpect.

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