rspec是否会记忆'subject'块?
我正在使用的编码标准规定,测试函数的一组规范应该有一个主题,即被调用的函数。看起来是这样的:rspec是否会记忆'subject'块?,rspec,subject,behaviorsubject,Rspec,Subject,Behaviorsubject,我正在使用的编码标准规定,测试函数的一组规范应该有一个主题,即被调用的函数。看起来是这样的: define User do context :foo do let(:user) { FactoryGirl.create(:user) } subject { user.foo } it { ... } end end subject块的典型用法是实例化正在测试的类: define User do subject { FactoryGirl.create(:us
define User do
context :foo do
let(:user) { FactoryGirl.create(:user) }
subject { user.foo }
it { ... }
end
end
subject
块的典型用法是实例化正在测试的类:
define User do
subject { FactoryGirl.create(:user) }
it { ... }
end
我们的风格指南的预期效果是,对于正在测试的每个方法,我们都有不同的主题块。这会减慢我们的测试速度吗?如果我们以典型的方式使用subject
,我们是否会从内置的记忆或其他加速中受益,因为每个类只有一个主题块
助理:
我遇到过一个我们的风格行不通的例子。当使用任何实例时。如果收到您不能遵循我们的样式指南,否则规范将始终失败。相反,您需要使用一种更传统的方法,其中subject
是您正在测试的对象,并且在规范中对其调用方法
# passing spec
define Foo do
before { Bar.any_instance.stub(:baz) }
subject { FactoryGirl.create(:foo) }
it "bazzes Bars" do
Bar.any_instance.should_receive(:baz)
subject.baz_the_bars
end
end
# spec follows style guide but fails
define Foo do
before { Bar.any_instance.stub(:baz) }
let(:foo) { FactoryGirl.create(:foo) }
subject { foo.baz_the_bars }
it "bazzes Bars" do
Bar.any_instance.should_receive(:baz)
subject
end
end
class Foo
has_many :bars
def baz_the_bars
bars.collect do |bar|
bar.baz
end.count(true)
end
end
使用这种风格,我是否还需要注意其他问题?主题是在每个测试中惰性创建的,范围是上下文
/描述
,就像让
一样。他们不应该有任何额外的开销
我个人不喜欢您展示的样式,但当我有从方法返回的非常复杂(或只是大)的数据对象时,我也做了类似的事情
describe "A thing" do
subject(:foo) { FactoryGirl.create(:foo) }
# A very complicated object from this method
describe "the result of calling frob" do
subject(:result) { foo.frob }
it { should be_active }
it { should be_alive }
end
end
我可能遗漏了什么,为什么你的酒吧存根会引起问题?主题尚未被调用,因此在方法运行之前仍应设置断言。在before
块中,我没有存根条。我在Bar
的任何实例上存根方法baz()
。我的第一个通行证是:在{Bar.stub(:baz)}
之前,这同样有效。但是,这并没有通过代码审查,所以我需要在块之前修改。抱歉,我不清楚-我的意思是在所有条上存根baz
。然而,我仍然不明白为什么你的测试失败了。您能否将示例更新为可运行的define
在这里不是有效的关键字,我认为您可以删除对ActiveModel和FactoryGirl的引用。也许这也会让问题更容易回答。对不起,如果我的问题不清楚的话。我不是在问使用主题是否有额外的开销。我在问,如果不在任何地方使用同一主题,是否会有额外的开销。基本上,这门学科有一些我们没有利用的回忆录。我将编辑这个问题以试图澄清。谢谢你的回答。我也无意中回答了这个问题-主题在一次测试中被记忆,但它是每次测试,所以每次都会被重置。您可能有数千个subject
块(这不是一个好主意),唯一额外的时间就是解析文件。谢谢。很高兴知道。我们确实有数千个主题块。从来没有人问过我这是不是个坏主意,但这是做事的方式。只要团队意见一致,我不在乎我们做的事情是否与其他人不同。至少我试着告诉自己:)