2014-09-27 54 views
1

我是新來的紅寶石在軌道上。當我在comment_spec.rb rspec的運行我得到一個未定義的方法錯誤未定義的局部變量或方法`請求'

1) after_save calls 'Post#update_rank' after save 
    Failure/Error: request.env["HTTP_REFERER"] = '/' 
    NameError: 
     undefined local variable or method `request' for #<RSpec::ExampleGroups::AfterSave:0x007fa866ead8d0> 
    # ./spec/models/vote_spec.rb:45:in `block (2 levels) in <top (required)>' 

這是我的規格:

require 'rails_helper' 

describe Vote do 

    .... 

    describe 'after_save' do 
     it "calls 'Post#update_rank' after save" do 
      request.env["HTTP_REFERER"] = '/' 
      @user = create(:user) 
      @post = create(:post, user: @user) 
      sign_in @user 

      vote = Vote.new(value:1, post: post) 
      expect(post). to receive(:update_rank) 
       vote.save 
     end 
    end 

任何幫助,你將不得不將不勝感激......

+0

你的模型規格都無關的要求,甚至在登錄用戶是什麼。你想要做什麼? – sevenseacat 2014-09-27 15:08:30

回答

1

確定這裏的交易。

投票是一個模型,我想。 您正在爲該模型編寫測試。

模型測試(「域邏輯正在做它應該做的事情」)和特性/集成測試(「應用程序按照其應該的方式行事」)之間有區別。

請求變量與功能或控制器測試相關聯。

那麼,怎麼了? 您在模型測試中沒有登錄用戶,只需檢查update_rank方法是否在保存時被調用,那就是它。

模型測試中沒有用戶交互爵士樂。

希望有幫助! 乾杯 月

0

所以路易,只是爲了在一月的反應擴大:

你似乎是寫一個模型規範。模型規範的目的僅僅是測試你的模型類是如何工作的,而且這種行爲是可測試的,而不必關注登錄時的應用邏輯,向特定控制器發出「請求」或訪問特定頁面。

你基本上只是測試一些相關的Ruby類。爲此,我們不需要考慮整個應用程序 - 僅僅是我們正在測試的類。

因此,RSpec中不會使在spec/models目錄中提供的某些方法 - 你不應該想想這些測試要求或認證。

它看起來像你的測試只是爲了確保當你爲一個帖子創建一個投票,它會更新該帖子的等級(或者,特別是,調用該帖子的update_rank方法)。要做到這一點,你不需要需要創建一個用戶,或簽署一個用戶,或注意request(我們會提到什麼要求?我們只是在Rails控制檯中測試,沒有涉及HTTP請求)。

因此,除了創建帖子的行和帖子的用戶(如果帖子模型驗證用戶的存在),您基本上可以刪除前四行測試。不要在用戶中籤名 - 我們只是測試一個Ruby類。在這個測試中沒有網站登錄的概念。

然後,作爲最後一件事要注意讓你的規格通過,請務必參考你以正確名稱創建的post。現在,您正在創建一篇文章,並將其分配給@post變量,但稍後您會提到postpost不存在;只是@post。你必須選擇一個變量名並堅持下去。

4

我是繼apirails書籍教程第3章這裏 http://apionrails.icalialabs.com/book/chapter_three

我收到了同樣的錯誤,並DrPositron的解決方案爲我工作,再次綠色。只需要添加「:類型=>:控制器」我的塊上像這樣:

describe Api::V1::UsersController, :type => :controller do 

end 

希望這可以幫助別人

相關問題