Ruby on rails 安装新Rails版本后,测试失败

Ruby on rails 安装新Rails版本后,测试失败,ruby-on-rails,unit-testing,ruby-on-rails-4,Ruby On Rails,Unit Testing,Ruby On Rails 4,从4.0.0安装Rails 4.0.2之后,我的测试失败了。它在浏览器中工作(开发)。Rails 4.0.3也会出现这种情况 20) Error: UserFlowsTest#test_login_and_browse_site: ActionView::Template::Error: No route matches {:id=>nil} missing required keys: [:id] app/views/posts/_post.haml:10:in `_app_views_

从4.0.0安装Rails 4.0.2之后,我的测试失败了。它在浏览器中工作(开发)。Rails 4.0.3也会出现这种情况

20) Error:
UserFlowsTest#test_login_and_browse_site:
ActionView::Template::Error: No route matches {:id=>nil} missing required keys: [:id]
app/views/posts/_post.haml:10:in `_app_views_posts__post_haml__439576154_44475312'
app/views/posts/index.haml:1:in `_app_views_posts_index_haml__194952016_42560292'
app/controllers/posts_controller.rb:22:in `block (2 levels) in index'
app/controllers/posts_controller.rb:21:in `index'
test/integration/user_flows_test.rb:14:in `block in <class:UserFlowsTest>'
这是邮政局的电话线。哈姆:10

%a{href: user_path(post.user)}= post.user.username if post.user
这些文档没有什么帮助:


测试输出:

-----------------------------------------
UserFlowsTest: test_login_and_browse_site
-----------------------------------------
Started GET "/users/login" for 127.0.0.1 at 2014-02-14 21:35:13 -0500
Processing by UsersController#login as HTML
  Rendered users/_login.haml (0.0ms)
  Rendered users/_new.haml (41.0ms)
  Rendered layouts/_header.haml (0.0ms)
  Rendered layouts/_right_bar.haml (1.0ms)
Completed 200 OK in 47ms (Views: 47.0ms | ActiveRecord: 0.0ms)
Started POST "/users/login" for 127.0.0.1 at 2014-02-14 21:35:13 -0500
Processing by UsersController#loginCreate as HTML
  Parameters: {"username"=>"chloe", "password"=>"[FILTERED]"}
"*********************************************************************** 1"
Redirected to https://www.example.com/
Completed 302 Found in 160ms (ActiveRecord: 0.0ms)
Started GET "/" for 127.0.0.1 at 2014-02-14 21:35:13 -0500
Processing by PostsController#index as HTML
  Rendered posts/_vote.haml (7.0ms)
  Rendered posts/_post.haml (18.0ms)
Completed 500 Internal Server Error in 45ms
E-------------------------------
这是UsersController#loginCreate的结尾

  session[:user_id] = @user.id
  p "*********************************************************************** #{session[:user_id]}" 
  redirect_to root_url, :notice => "Logged in! Last seen from #{lastIP}."
这是来自Rails控制台的

irb(main):009:0> p = Post.first
irb(main):011:0> app.user_path(p.user)
=> "/users/1"

这是最简单的错误

 21) Error:
PostsControllerTest#test_should_get_index:
ActionView::Template::Error: No route matches {:id=>nil} missing required keys: [:id]
    app/views/posts/_post.haml:10:in `_app_views_posts__post_haml__1028637779_43998912'
    app/views/posts/index.haml:1:in `_app_views_posts_index_haml__48584214_43731948'
    app/controllers/posts_controller.rb:22:in `block (2 levels) in index'
    app/controllers/posts_controller.rb:21:in `index'
    test/controllers/posts_controller_test.rb:26:in `block in <class:PostsControllerTest>'

更多信息

$ RAILS_ENV=test rails console
DL is deprecated, please use Fiddle
Loading test environment (Rails 4.0.3)
irb(main):001:0> Post.pluck(:user_id)
=> [0, 1, 2]

可能您的用户没有id:

post.user.id => id

这意味着post用户未被持久化?

我必须在post装置中将用户id从0更改为1。这是一系列变化的连锁反应。为了以防万一,我还将
if
放在HAML中的另一行,而不是放在行的末尾。HAML属性似乎是在
if
语句之前进行评估的。

您的测试正在测试一个收集路由:index,但测试在成员路由上显示了一个错误,如它查找:id所示


您正在实例化您的部分(app/views/posts/_post.haml),其中有一个链接的id为nil,或者您的路由文件就是问题所在

更改版本之前,所有测试均已通过。用户在设备中有一个id。您能否发布“/users/login/”控制器的显著操作?这可能是一个严重的参数问题吗?最简单的诊断方法是在重定向之前的点上binding.pry。它与登录无关,因为它是重定向。在登录后显示post时似乎失败。它就是这样做的:
session[:user\u id]=@user.id;将_重定向到root_url,:notice=>“登录!最后一次看到它是从#{lastIP}。”
。不仅仅是这一个,还有几十个测试也同样失败。对不起,我编辑了我的原始评论。你能确定会话[:user_id]是什么吗?从你的错误看来好像是零。我不知所措。根据您所展示的内容,我唯一能想到的是,在呈现链接时,
post.user
为零。如果要将user.posts集合传递到_posts部分,我不知道为什么会这样。不,这不是路由文件<代码>用户路径(post.user)是成员路由。这是因为在版本4.0.0中,Rails将允许具有不存在的关系id的fixture,但在版本4.0.3中,如果关系id不存在,它将抛出异常。fixture中的Post.user_id设置为0,fixture中不存在用户id 0。用户ID以1开头。所以它死了。
$ RAILS_ENV=test rails console
DL is deprecated, please use Fiddle
Loading test environment (Rails 4.0.3)
irb(main):001:0> Post.pluck(:user_id)
=> [0, 1, 2]
post.user.id => id