未定义的局部变量或方法`request'

时间:2014-09-27 15:06:21

标签: ruby-on-rails rspec

我是ruby on rails的新手。我在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

您将获得的任何帮助将不胜感激......

4 个答案:

答案 0 :(得分:4)

我在这里遵循apirails书籍教程第3章 http://apionrails.icalialabs.com/book/chapter_three

我收到同样的错误,DrPositron的解决方案对我有用,全部再次为绿色。只需在我的块上添加“:type =&gt;:controller”就像这样:

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

end

希望这有助于某人

答案 1 :(得分:1)

好的,这笔交易。

我想,投票是一种模式。 您正在为该模型编写测试。

模型测试之间存在差异(&#34;域逻辑正在做它应该做的事情&#34;)和功能/集成测试(&#34;应用程序的行为方式应该是&## 34。)

请求变量与功能或控制器测试相关联。

那有什么不对? 您没有在模型测试中登录用户,只需检查是否在保存时调用update_rank方法,就是这样。

模型测试中没有用户互动的爵士乐。

希望有所帮助! 干杯 扬

答案 2 :(得分:1)

所以路易斯,只是为了扩展Jan的回应:

您似乎正在编写模型规范。模型规范的目的只是测试模型类的工作方式,并且该行为是可测试的,无需关注登录时的应用程序逻辑,向特定控制器发出“请求”或访问特定页面。

  

你基本上只是在测试几个相关的Ruby类。为此,我们不需要考虑整个应用程序 - 只是我们正在测试的类。

因此,RSpec不会在spec/models目录中提供某些方法 - 您不会假设在这些测试中考虑请求或身份验证。

看起来您的测试只是为了确保在为帖子创建投票时,它会更新帖子的排名(或者,具体来说,调用帖子的update_rank方法)。要做到这一点,你需要创建用户,或签署用户,或关注request(我们将提到什么请求?我们是只是在Rails控制台中测试它,没有涉及HTTP请求)。

因此,您基本上可以删除测试的前四行 - 除了创建帖子的行,以及帖子的用户(如果有必要)(如果帖子模型验证了用户的存在)。不要签署用户 - 我们只是测试一个Ruby类。在此测试中没有网站的概念。

然后,作为最后要注意让您的规范通过的事情,请务必参考您使用正确名称创建的post。现在,您正在创建一个帖子并将其分配给@post变量,但之后您只是引用了postpost不存在;只是@post。你必须选择一个变量名称并坚持下去。

答案 3 :(得分:1)

此外,如果您使用的是RSpec 3,则默认情况下现在禁用文件类型推断,且必须为opted in as described here。如果您是RSpec新手,请quick overview of the canonical directory structure is here

例如,对于RelationshipsController的控制器规范,请插入, :type => :controller

describe RelationshipsController, :type => :controller do
  #spec
end