簡體   English   中英

Rails / RSpec中的存根專用控制器方法

[英]Stub private controller methods in Rails / RSpec

遇到以下簡單測試問題:

book_spec.rb

let(:books_controller) { BooksController.new }

context "GET #index" do
  it "calls Book.all" do
    Book.should_receive(:all)
    book_controller.index
  end
end

books_controller.rb

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM