ruby-on-rails 在RSpec中“expect”和“should”之间有区别吗?

wko9yo5t  于 2023-04-22  发布在  Ruby
关注(0)|答案(2)|浏览(175)

例如,这两个测试:

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

它们返回不同的输出(第一个失败,而第二个通过)。我希望两者都通过或失败,这取决于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

我认为'should'可以工作的原因是因为'it“has a name”'测试中的语法类似。如果结果是'should'不正确而'expect...to'正确,我想知道什么时候使用一个或另一个。谢谢。

oewdyzsn

oewdyzsn1#

引用自https://github.com/rspec/rspec-expectations/blob/master/Should.md
从一开始,RSpec::Expectations就提供了shouldshould_not方法来定义任何对象上的期望。在2.11版本中,引入了expect方法,现在推荐使用该方法来定义对象上的期望。
该文档下一段描述了实现上的差异以及为什么expect现在是推荐的方法。
现在,你可以用shouldshould_not做的任何事情都可以用expect完成。有关详细信息和expect的用法,请参阅http://rubydoc.info/gems/rspec-expectations/frames
至于你的具体代码,第一个例子失败的原因是错误在RSpec有机会参与之前就发生了。你仍然可以使用should来检查错误的引发,但是你必须给予RSpec一个工作的机会。语法是lambda {...}.should raise_error,其中...是你正在测试的代码。

inb24sb2

inb24sb22#

EDIT这是一个旧的答案-在最新版本的RSpec中,不再推荐使用should。请改用expect语法

是的有区别
should将验证右边的是true。它必须用于简单的结果比较。

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

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

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

尽可能地使用should(这样更容易编写),只有当should不能完成任务时才使用expect

相关问题