练习任务多次调用 我在测试我的栏杆任务时有一个奇怪的问题。当我为我的耙任务运行所有测试时,它们被多次调用,但是当我只运行一个测试文件时,一切都突然

问题描述 投票:0回答:2

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
ruby-on-rails rspec rake rspec-rails
2个回答
4
投票
.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

,也没有意识到它也在

1
投票

不确定为什么加载任务再次使我的任务在规格中被调用,而是删除额外的负载为我解决了问题。
	

© www.soinside.com 2019 - 2024. All rights reserved.