我正在尝试在RSpec中测试一个对象。我想在之前和之后检查多项内容,因此我按照我在网络上找到的示例进行了操作,结果是这样的:
describe Processor do
before(:each) do
# create some data in temp to run the test against
end
after(:each) do
# wipe out the data we put in temp
end
let(:processor) { Processor.new }
describe '#process' do
subject { lambda { processor.process } }
# it should actually perform the processing
it { should change { count('...') }.from(0).to(1) }
it { should change { count('...') }.from(0).to(2) }
# it should leave some other things unaffected
it { should_not change { count('...') } }
end
end
这确实有效,但我看到的是before()
代码和#process
都很慢 - 并且由RSpec执行三次。
通常当你有一个缓慢的事情时,人们会说“只是嘲笑它”,但这一次,我试图测试哪个是缓慢的,所以这将毫无意义。
在所有检查都属于前后种类的情况下,如何避免多次调用测试主题?
答案 0 :(得分:2)
之前(:each)和之后(:each)是在每个规范之前和之后调用的回调,即每个'它'。如果您希望在外部'describe'块之前和之后执行某些操作,请使用before(:all)和after(:all)。
请参阅rspec docs here (relishapp)。
(但是,请注意,如果您使用带有rails的rspec,则使用before / after(:all)将在数据库的常规清理之外运行,这可能会导致测试数据库中的垃圾。)
祝你好运!