![](/img/trans.png)
[英]When testing a rake task, why does rspec receive this method twice when it is only called once?
[英]Rake task executing twice when only called once
我寫了一個非常簡單的 rake 任務來嘗試找到這個問題的根源。
namespace :foo do
task bar: :environment do
puts 'RUNNING'
end
end
在控制台rake foo:bar
中執行時,output 是:
RUNNING
RUNNING
當我執行任何 rake 任務時會發生這種情況。 有沒有人遇到過這樣的事情?
編輯
上面的 rake 任務就是寫在那個 .rake 文件中的所有內容。
這是當前正在使用的 Rakefile。
require File.expand_path('../config/application', __FILE__)
OurApp::Application.load_tasks
這里還有運行 --trace 的 output。
** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: ourhost
** Execute foo:bar
RUNNING
RUNNING
這可以在全新的應用程序中重現。 如果不將:environment
參數傳遞給rake任務,該問題將消失。
我將問題追溯到~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb
,在此我們為該rake任務兩次點擊了~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb
enhance()
方法:
[99, 108] in /Users/inovakov/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb
99: # Enhance a task with prerequisites or actions. Returns self.
100: def enhance(deps=nil, &block)
101: byebug if self.to_s.include? 'foo'
102: @prerequisites |= deps if deps
103: @actions << block if block_given?
=> 104: self
105: end
106:
107: # Name of the task, including any namespace qualifiers.
108: def name
(byebug) @actions
[#<Proc:0x007ff492701aa0@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>, #<Proc:0x007ff4920d3f70@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>]
在第一次和第二次之間,我們使用此方法初始化環境-在本例中為app/config/environments/development.rb
。
如果在rake任務中有兩個輸出,我們將同時看到它們:
bash-3.2$ bundle exec rake foo:bar --trace
** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: localhost
** Execute foo:bar
RUNNING
STILL RUNNING
RUNNING
STILL RUNNING
(我知道這不是一個答案,但是我還沒有評論權限,這有望對討論有所幫助。)
Rake任務可以運行兩次的原因很多,在這種特定情況下,我認為它可能與Rake環境加載多次有關,正如@kucaahbe所鏈接的問題所暗示的那樣。
我實際上是在這里自己尋求幫助的,但是我的問題有所不同,我設法找到了答案。 認為這不會對這個特定問題有所幫助,但我也將其保留在此處。
在@kucaahbe鏈接的問題之后,這表明如果您的環境兩次加載並初始化Rake,則會發生這種情況。
在上下文中,Rake任務需要運行rake
並已初始化,因此請確保您的任務不包含以下行:
require 'rake'
...
Rake.application.init
Rake.application.load_rakefile
在這種特定情況下,任務似乎沒有做任何事情,因此我將檢查其他任務或Rakefile
以強制Rake上下文加載兩次。
剛剛發生此問題是由於gem創建了一個具有相同名稱的Rake任務。
例如,如果您在Rails應用程序中聲明以下任務:
namespace :assets do
task :precompile do
puts "Hello"
end
end
並運行rake assets:precompile
:
...
I, [2017-07-31T11:25:09.498897 #9455] INFO -- : Writing /home/pfac/...css.gz
Hello
Hello
但是,如果您使用Rake::Task#clear
:
namespace :assets do
task(:precompile).clear
task :precompile do
puts "Hello"
end
end
它禁用任何先前存在的行為,並且僅打印Hello
。
我不認為此選項可以解決此特定問題,除非@ broc-broccoli定義了其他foo:bar
rake任務。
無論如何,希望這會有所幫助。
對我來說,由於我的測試文件中存在以下內容,因此我的rake應用程序在我的Rails應用程序中加載了兩次:
setup do
MyApp::Application.load_tasks
end
我將其刪除,並且該任務被調用了一次。
希望能有所幫助。
對不起我的英語不好。
在我的例子中,我明確地添加了從Rakefile加載的任務:
Rake.add_rakelib 'lib/tasks'
因此,刪除 so case 行可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.