2014-09-27 106 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 

希望这可以帮助别人

相关问题