RSPEC测试
describe 'create_users_on_another_app' do
before do
allow(AppClient).to receive(:post).and_return(some_response)
end
it "creates users" do
expect(AppClient).to receive(:post).with(some_url, some_data, some_header)
puts "JUST BEFORE INVOKING THE TASK: "
Rake::Task['after_party:create_users_on_another_app'].invoke
puts "DONE"
end
end
在控制台输出中,我可以看到这样的东西:
> JUST BEFORE INVOKING THE TASK:
> Running deploy task 'create_users_on_another_app'
> Running deploy task 'create_users_on_another_app'
> DONE
因此,该任务被调用了两次。
我不知道为什么会发生这种情况,我100%确定我不会在代码中两次调用它。我怀疑我缺少RSPEC的一些耙子配置,或者是我正在使用的耙子任务的宝石 -
after_party
.。 我在艰难的时期调试它,尝试使用
show-stack
binding.pry
在我的耙子任务中使用
it
,这是造成问题的,但没有设法在何时开除其他耙子任务。
任何人以前都看过这样的问题吗?
Edit:st
invoke
也从耙子任务内部附加堆栈跟踪本身:
=> #0 <main>
#1 [block] block in run <Byebug::PryProcessor#run(&_block)>
#2 [method] run <Byebug::PryProcessor#run(&_block)>
#3 [method] resume_pry <Byebug::PryProcessor#resume_pry()>
#4 [method] at_line <Byebug::PryProcessor#at_line()>
#5 [method] at_line <Byebug::Context#at_line()>
#6 [block] block (2 levels) in <top (required)>
#7 [block] block in run <RSpec::Core::Example#run(example_group_instance, reporter)>
#8 [block] block in with_around_and_singleton_context_hooks <RSpec::Core::Example#with_around_and_singleton_context_hooks()>
#9 [block] block in with_around_example_hooks <RSpec::Core::Example#with_around_example_hooks()>
#10 [block] block in run <RSpec::Core::Hooks::HookCollections#run(position, scope, example_or_group)>
#11 [block] block in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#12 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#13 [block] block (2 levels) in <module:MinitestLifecycleAdapter>
#14 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#15 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#16 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#17 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#18 [block] block (3 levels) in <top (required)>
#19 [method] perform_enqueued_jobs <ActiveJob::TestHelper#perform_enqueued_jobs(?, ?)>
#20 [block] block (2 levels) in <top (required)>
#21 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#22 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#23 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#24 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#25 [block] block in run <RSpec::Retry#run()>
#26 [method] run <RSpec::Retry#run()>
#27 [method] run_with_retry <RSpec::Core::Example::Procsy#run_with_retry(opts=?)>
#28 [block] block (2 levels) in setup <self.setup(UNKNOWN) (undefined method)>
#29 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#30 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#31 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#32 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#33 [method] run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#34 [method] run <RSpec::Core::Hooks::HookCollections#run(position, scope, example_or_group)>
#35 [method] with_around_example_hooks <RSpec::Core::Example#with_around_example_hooks()>
#36 [method] with_around_and_singleton_context_hooks <RSpec::Core::Example#with_around_and_singleton_context_hooks()>
#37 [method] run <RSpec::Core::Example#run(example_group_instance, reporter)>
#38 [block] block in run_examples <RSpec::Core::ExampleGroup.run_examples(reporter)>
#39 [method] run_examples <RSpec::Core::ExampleGroup.run_examples(reporter)>
#40 [method] run <RSpec::Core::ExampleGroup.run(reporter=?)>
#41 [block] block (3 levels) in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#42 [block] block (2 levels) in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#43 [method] with_suite_hooks <RSpec::Core::Configuration#with_suite_hooks()>
#44 [block] block in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#45 [method] report <RSpec::Core::Reporter#report(expected_example_count)>
#46 [method] run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#47 [method] run <RSpec::Core::Runner#run(err, out)>
#48 [method] run <RSpec::Core::Runner.run(args, err=?, out=?)>
#49 [method] invoke <RSpec::Core::Runner.invoke()>
#50 [top] <top (required)>
#51 [eval] <main>
#52 [main] <main>
Edit2:添加了更多信息我已经检查了如果我放置
=> #0 <main>
#1 [block] block in run <Byebug::PryProcessor#run(&_block)>
#2 [method] run <Byebug::PryProcessor#run(&_block)>
#3 [method] resume_pry <Byebug::PryProcessor#resume_pry()>
#4 [method] at_line <Byebug::PryProcessor#at_line()>
#5 [method] at_line <Byebug::Context#at_line()>
#6 [block] block (2 levels) in <top (required)>
#7 [block] block in execute <Rake::Task#execute_without_bugsnag(args=?)>
#8 [method] execute <Rake::Task#execute_without_bugsnag(args=?)>
#9 [method] execute_with_bugsnag <Rake::Task#execute_with_bugsnag(args=?)>
#10 [block] block in invoke_with_call_chain <Rake::Task#invoke_with_call_chain(task_args, invocation_chain)>
#11 [method] mon_synchronize <MonitorMixin#mon_synchronize()>
#12 [method] invoke_with_call_chain <Rake::Task#invoke_with_call_chain(task_args, invocation_chain)>
#13 [method] invoke <Rake::Task#invoke(*args)>
#14 [block] block (2 levels) in <top (required)>
#15 [block] block in run <RSpec::Core::Example#run(example_group_instance, reporter)>
#16 [block] block in with_around_and_singleton_context_hooks <RSpec::Core::Example#with_around_and_singleton_context_hooks()>
#17 [block] block in with_around_example_hooks <RSpec::Core::Example#with_around_example_hooks()>
#18 [block] block in run <RSpec::Core::Hooks::HookCollections#run(position, scope, example_or_group)>
#19 [block] block in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#20 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#21 [block] block (2 levels) in <module:MinitestLifecycleAdapter>
#22 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#23 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#24 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#25 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#26 [block] block (3 levels) in <top (required)>
#27 [method] perform_enqueued_jobs <ActiveJob::TestHelper#perform_enqueued_jobs(?, ?)>
#28 [block] block (2 levels) in <top (required)>
#29 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#30 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#31 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#32 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#33 [block] block in run <RSpec::Retry#run()>
#34 [method] run <RSpec::Retry#run()>
#35 [method] run_with_retry <RSpec::Core::Example::Procsy#run_with_retry(opts=?)>
#36 [block] block (2 levels) in setup <self.setup(UNKNOWN) (undefined method)>
#37 [method] instance_exec <RSpec::Core::Example#instance_exec(*args, &block)>
#38 [method] execute_with <RSpec::Core::Hooks::AroundHook#execute_with(example, procsy)>
#39 [block] block (2 levels) in run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#40 [method] call <RSpec::Core::Example::Procsy#call(*args, &block)>
#41 [method] run_around_example_hooks_for <RSpec::Core::Hooks::HookCollections#run_around_example_hooks_for(example)>
#42 [method] run <RSpec::Core::Hooks::HookCollections#run(position, scope, example_or_group)>
#43 [method] with_around_example_hooks <RSpec::Core::Example#with_around_example_hooks()>
#44 [method] with_around_and_singleton_context_hooks <RSpec::Core::Example#with_around_and_singleton_context_hooks()>
#45 [method] run <RSpec::Core::Example#run(example_group_instance, reporter)>
#46 [block] block in run_examples <RSpec::Core::ExampleGroup.run_examples(reporter)>
#47 [method] run_examples <RSpec::Core::ExampleGroup.run_examples(reporter)>
#48 [method] run <RSpec::Core::ExampleGroup.run(reporter=?)>
#49 [block] block (3 levels) in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#50 [block] block (2 levels) in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#51 [method] with_suite_hooks <RSpec::Core::Configuration#with_suite_hooks()>
#52 [block] block in run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#53 [method] report <RSpec::Core::Reporter#report(expected_example_count)>
#54 [method] run_specs <RSpec::Core::Runner#run_specs(example_groups)>
#55 [method] run <RSpec::Core::Runner#run(err, out)>
#56 [method] run <RSpec::Core::Runner.run(args, err=?, out=?)>
#57 [method] invoke <RSpec::Core::Runner.invoke()>
#58 [top] <top (required)>
#59 [eval] <main>
#60 [main] <main>
(以及在耙子任务中)会发生什么
binding.pry
聚会后的贝洛(Below)
it "creates users" do
expect(AppClient).to receive(:post).with(some_url, some_data, some_header)
binding.pry # no1 before rake task invokation
Rake::Task['after_party:create_users_on_another_app'].invoke
binding.pry # no3 after rake task invokation
puts "DONE"
end
输出是代码执行在
namespace :after_party do
desc 'Deployment task: create_users_on_another_app'
task create_users_on_another_app: :environment do
...some code
binding.pry # no2 inside the task
AppClient.post(some_url, some_payload, some_header)
...some more code
AfterParty::TaskRecord.create version: '20190620160110'
end
end
end
停止,然后我们进入了耙子任务并在no1
no2
),然后它停在
no2
i有同样的问题,但是通过检查如何将任务加载到显然无关的任务规格文件中来解决。 在另一个规格文件中,其中已测试的任务已加载为
no3
实际上加载了所有任务。 因此,在我正在处理的规格文件中,我当然需要我要测试的任务;因此,只有当我加载整个测试套件时,才会第二次加载此任务。用
取代这条线
Rails.application.load_tasks
用Rake.application.rake_require 'tasks/your_task_file'
而不是.execute
.invoke
不过不会加载
.execute
,因此,如果您需要它,您可能想找到一种方法
取决于如何在测试中加载耙子任务
:environment
在这两个文件的一次测试中,不太好。耙子似乎两次注册了耙子任务。您需要注意耙子任务只会被注册一次:
# File1
dscribe 'some test 1' do
before do
Dir.glob('lib/tasks/*.rake').each { |r| load r }
end
...
end
# File2
dscribe 'some test 2' do
before do
Dir.glob('lib/tasks/*.rake').each { |r| load r }
end
...
end
应该工作,因为测试注册只完成了一次。或以某种方式使用。
RSpec.configure do |config|
confige.before :suite do
Dir.glob('lib/tasks/*.rake').each { |r| load r }
end
end
检查是否已经注册了文件。
我的文件顶部有
require
,也没有意识到它也在不确定为什么加载任务再次使我的任务在规格中被调用,而是删除额外的负载为我解决了问题。