[英]Stub private controller methods in Rails / RSpec
遇到以下簡單測試問題:
let(:books_controller) { BooksController.new }
context "GET #index" do
it "calls Book.all" do
Book.should_receive(:all)
book_controller.index
end
end
def index
respond_with books
end
private
def books
@books ||= Book.all
end
我想對ActiveRecord進行調用,以便它不需要與數據庫交互並加快測試速度。 但是我似乎無法正確地做到這一點。
對不起,忘記了最重要的一點!
Failure/Error: book_controller.index
NoMethodError:
undefined method `variant' for nil:NilClass
通過實例化控制器在Rails中測試控制器將很困難。 大多數控制器測試使用Rspec的get
方法調用控制器動作。 嘗試類似的方法:
context "GET #index" do
it "calls Book.all" do
expect(Book).to receive(:all)
get :index
end
end
如果您確實不想觸摸ActiveRecord,則可以通過將測試更改為以下內容來對Book
進行存根:
let(:book) { double(:book, all: true) }
context "GET #index" do
it "calls Book.all" do
stub_const("Book", book)
expect(Book).to receive(:all)
get :index
end
end
但是,我認為您在此處暫存活動記錄不會帶來很大的速度改進。 在運行測試時,加載Rails環境是最大的時間開銷,尤其是對於小型測試套件而言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.