例如,这两个测试:
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'正确,我想知道什么时候使用一个或另一个。谢谢。
2条答案
按热度按时间oewdyzsn1#
引用自https://github.com/rspec/rspec-expectations/blob/master/Should.md:
从一开始,
RSpec::Expectations
就提供了should
和should_not
方法来定义任何对象上的期望。在2.11版本中,引入了expect
方法,现在推荐使用该方法来定义对象上的期望。该文档下一段描述了实现上的差异以及为什么
expect
现在是推荐的方法。现在,你可以用
should
和should_not
做的任何事情都可以用expect
完成。有关详细信息和expect
的用法,请参阅http://rubydoc.info/gems/rspec-expectations/frames。至于你的具体代码,第一个例子失败的原因是错误在RSpec有机会参与之前就发生了。你仍然可以使用
should
来检查错误的引发,但是你必须给予RSpec一个工作的机会。语法是lambda {...}.should raise_error
,其中...
是你正在测试的代码。inb24sb22#
EDIT这是一个旧的答案-在最新版本的RSpec中,不再推荐使用
should
。请改用expect
语法是的有区别
should
将验证右边的是true
。它必须用于简单的结果比较。expect
获取一个块,并验证该块的执行是否有特定的效果。当比较该块执行前后的情况时必须使用尽可能地使用
should
(这样更容易编写),只有当should
不能完成任务时才使用expect