我使用下面的代碼從一個耙子任務中在服務器上執行的請求:強制的Rails的app.get重做請求
app = ActionDispatch::Integration::Session.new(Rails.application)
app.host!('localhost:3000')
app.get(path)
這種運作良好。
但是,如果我再次調用app.get(path)
具有相同路徑,則不會重複該請求,並返回以前的結果。
有沒有一種方法可以強制app.get重複調用?
我使用下面的代碼從一個耙子任務中在服務器上執行的請求:強制的Rails的app.get重做請求
app = ActionDispatch::Integration::Session.new(Rails.application)
app.host!('localhost:3000')
app.get(path)
這種運作良好。
但是,如果我再次調用app.get(path)
具有相同路徑,則不會重複該請求,並返回以前的結果。
有沒有一種方法可以強制app.get重複調用?
我已經弄清楚發生了什麼事情。
基本上,「請求不重複」的觀察結果是Rails自己的緩存行爲。有意義的是,app.get
被視爲任何其他請求,如果啓用了緩存,則會返回緩存,如果不是,則會重複(如@henrikhodne聲明的那樣)。這就解釋了爲什麼緩存控制器中的puts
第二次不會輸出。
要驗證,請在2個控制器方法中添加一個puts
,但僅在第二個方法中設置expires_in
。第一個將重複輸出,第二個不會。
強制重複請求的方法是通過修改URL來緩存緩存。與使用HTTP時一樣, app.get("/")
將變爲app.get("/?r=123456")
。事後看來這一切似乎都很明顯,基本上app.get
被完全視爲客戶端請求,並且所有相同的規則都適用。
嘗試重置會話:
app.reset!
這裏是如何工作的,當復位,
def reset!
@https = false
@controller = @request = @response = nil
@_mock_session = nil
@request_count = 0
@url_options = nil
self.host = DEFAULT_HOST
self.remote_addr = "127.0.0.1"
self.accept = "text/xml,application/xml,application/xhtml+xml," +
"text/html;q=0.9,text/plain;q=0.8,image/png," +
"*/*;q=0.5"
unless defined? @named_routes_configured
# the helpers are made protected by default--we make them public for
# easier access during testing and troubleshooting.
@named_routes_configured = true
end
end
否則將只是重新使用最後一個響應:
# this is a private method in Session, it will called every time you call `get/post, etc`
def process
......
@request_count += 1
@request = ActionDispatch::Request.new(session.last_request.env)
response = _mock_session.last_response
@response = ActionDispatch::TestResponse.new(response.status, response.headers, response.body)
@html_document = nil
....
end
祝你好運!
它實際上不重用最後一個響應。如果你在代碼中看起來更深一層,它會將請求發送到'_mock_session',覆蓋'last_response'屬性。不過,'#reset!'可能仍然有效。 – henrikhodne
'app.reset!'在我的測試中沒有影響。我的問題是鐵路自己的緩存系統被激活(因爲它是一個正常的HTTP請求),請參閱我的答案。我感謝你的幫助,雖然這調查! –
你怎麼知道第二個'app.get(path)'不重複請求?我只是查看了「ActionDispatch :: Integration :: Session」的代碼,並沒有指出任何緩存。 – henrikhodne
@henrikhodne控制器中存在的任何'puts'方法將爲第一個請求輸出路由。 –
@henrikhodne你是對的。它不是執行任何緩存的'ActionDispatch :: Integration :: Session',而是標準的rails緩存管道做的事情,就像標準的HTTP請求一樣。我已經詳細闡述了我的答案。 –