我是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
您将获得的任何帮助将不胜感激......
答案 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
变量,但之后您只是引用了post
。 post
不存在;只是@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