簡體   English   中英

帶有斷言和分配的 rspec-rails 控制器測試

[英]rspec-rails controller testing with assertions and assigns

我一直在使用 rails 5.0.0.1,我是自動化測試的新手,並且使用 rspec-rails-3.5.2 來編寫自動化。

我想測試一些基本的控制器渲染功能和實例變量分配。 編寫了一個控制器測試用例,它將檢查是否呈現了 get_structure 模板並分配了所需的實例變量。

describe 'GET #get_structure' do
    context 'get attributes to build tree structure' do
      let(:plan) { FactoryGirl.create(:plan) }

      it 'expects all keys to build structure' do
        get :get_structure, params: { id: 6, school_subdomain: 'chrys' }

        expect(response).to render_template(:get_structure)
        expect(assigns.keys.include?('collection')).to be true
        expect(assigns.keys.include?('structure')).to be true
        expect(assigns.keys.include?('config')).to be true
      end

    end
  end

一旦我運行了測試用例,我意識到由於某些安全原因,assert_template 不再受支持。

NoMethodError: assert_template 已被提取到 gem 中。 要繼續使用它,請將gem 'rails-controller-testing'到您的 Gemfile。

由於它在 rspec-rails 文檔中提到使用 rails-controller-testing gem 將添加回功能,我確實添加了它。

在 Rails 5.x 中,控制器測試已移至其自己的 gem 中,即 rails-controller-testing。 在您的控制器規范中使用分配而不添加此 gem 將不再有效。

我添加了 rails-controller-testing-1.0.1 gem。 同樣在 rails-controller-testing gem 文檔中提到

rspec-rails 自 3.5.0 版起自動與此 gem 集成。 將 gem 添加到您的 Gemfile 中就足夠了。

但即使添加后,它仍然拋出相同的錯誤。

如何解決這個問題? 有沒有其他方法可以進行控制器測試。 一段時間以來,我一直在為此煩惱。 任何幫助,將不勝感激。 提前致謝。

Rails: Support for Rails 5下的發行說明中,您可以找到測試控制器的推薦方法是Request specs

對於新的 Rails 應用程序:我們不建議將 rails-controller-testing gem 添加到您的應用程序中。 Rails 團隊和 RSpec 核心團隊的官方建議是改為編寫請求規范 請求規范允許您專注於單個控制器操作,但與控制器測試不同的是,測試涉及路由器、中間件堆棧以及機架請求和響應。 這增加了您正在編寫的測試的真實性,並有助於避免控制器規范中常見的許多問題。 在 Rails 5 中,請求規范比 Rails 4 中的請求規范或控制器規范要快得多,這要歸功於 Rails 提交團隊的 Eileen Uchitelle1 所做的工作。

請求測試也會命中視圖。 因此,您無需使用assert_template進行測試。

NoMethodError: assert_template has been extracted to a gem.搜索NoMethodError: assert_template has been extracted to a gem.時,這個問題首先出現NoMethodError: assert_template has been extracted to a gem. 這是當您嘗試使用 render_template 或assigns 編寫控制器規范或請求規范時出現的錯誤消息。

RSpec 文檔仍然使用它作為如何處理控制器和請求規范的示例。 Narashima Reddy在別處列出了為什么使用請求規范而不是控制器規范的理由 但我仍然不知道如何處理控制器或請求規范。

答案似乎是否定的。 assigns 和 assert_template都已棄用,這意味着使用它們是一種代碼味道。

與其編寫一個測試來檢查是否正在呈現模板,不如編寫一個測試來檢查該模板將顯示什么,或者響應是否成功。 與其編寫檢查是否已分配值的測試,不如檢查數據庫是否已更改,是否分配了 cookie 或會話,或是否顯示了值。

這對我來說是一個難以理解的概念,因為許多在線教程甚至官方 rspec 文檔都參考了 this ,但簡短的回答似乎是,不要這樣做。 我希望這有助於其他人搜索 assert_template 錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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