我已经对橡皮鸭进行了几次测试,我仍然空白。
编辑:在那里发布了错误的代码块。现在已经更新了正确的代码并分析了我所看到的内容。现在感觉很聪明。谢谢,@ max,帮助我。
我在实现新功能的同时重构了一个视图,出于某种原因,当我启动服务器并手动运行测试时,它运行正常,但是当我运行自动化测试时,它会失败。我无法弄清楚原因,谷歌(或SO)也没有提出任何有用的信息。
这是我在进行佣金测试时得到的结果:
ERROR["test_profile_display_but_not_skills", UsersProfileTest, 2015-08-03 01:16:05 +0000]
test_profile_display_but_not_skills#UsersProfileTest (1438564565.47s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `name' for nil:NilClass
app/views/shared/_user_info.html.erb:3:in `_app_views_shared__user_info_html_erb__2262201056850997174_70092126401660'
app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__3098944701378465381_70092126356440'
test/integration/users_profile_test.rb:11:in `block in <class:UsersProfileTest>'
app/views/shared/_user_info.html.erb:3:in `_app_views_shared__user_info_html_erb__2262201056850997174_70092126401660'
app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__3098944701378465381_70092126356440'
test/integration/users_profile_test.rb:11:in `block in <class:UsersProfileTest>'
ERROR["test_profile_display_skills", UsersProfileTest, 2015-08-03 01:16:05 +0000]
test_profile_display_skills#UsersProfileTest (1438564565.48s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `name' for nil:NilClass
app/views/shared/_user_info.html.erb:3:in `_app_views_shared__user_info_html_erb__2262201056850997174_70092126401660'
app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__3098944701378465381_70092126356440'
test/integration/users_profile_test.rb:19:in `block in <class:UsersProfileTest>'
app/views/shared/_user_info.html.erb:3:in `_app_views_shared__user_info_html_erb__2262201056850997174_70092126401660'
app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__3098944701378465381_70092126356440'
test/integration/users_profile_test.rb:19:in `block in <class:UsersProfileTest>'
我已经足够多次看到这个,知道它试图打电话给这个名字&#39;类中对象的方法是nil,并且通常是因为Rails试图在尚未定义的对象上调用某些东西。我认为它可能与我在我的user_path(users#show)视图中添加的新部分(shared / _user_info.html.erb)有关,这是我重构的一部分,我在开始工作时遇到了一些麻烦。但是a)当我查看服务器在终端中吐出的内容时页面之前的部分负载,以及b)我甚至(似乎)都没有对该功能进行更新,这是标题部分共享通过申请。此外,部分渲染在其使用的其他页面上(应用程序的主页)和该页面的所有测试都通过,所以我不认为它是部分的导致问题的原因。
这是保持失败的集成测试(test / integration / users_profile_test.rb):
test "profile display but not skills" do
get user_path(@user) # fail
assert_template 'users/show'
assert_select 'title', full_title(@user.name)
assert_select 'h1', text: @user.name
assert_select 'h1', text: @user.derby_name
end
test "profile display skills" do
get user_path(@user) # fail
assert_match @user.skills.count.to_s, response.body
@user.skills.each do |skill|
assert_match skill.name, response.body
assert_match skill.level.to_s, response.body
assert_match skill.comments, response.body
end
end
在这两种情况下,只要调用user_path(@user),就会发生故障。我不知道为什么这个特定的集成测试不能在我为@user设置的夹具上调用user_path;我的其他集成测试都没有问题。就测试而言,我不确定它是否与GET请求完全相同,但我能够在另一个集成测试中对user_path(@user)执行PATCH请求(测试/integration/users_edit_test.rb):
test "successful edit" do
get edit_user_path(@user) #pass
log_in_as(@user) #pass
patch user_path(@user), user: { name: "Foo Bar", derby_name: "Bar Foo", email: "foo@bar.com" } #pass
assert_redirected_to @user #pass
end
以下是造成问题的部分原因(我认为)(app / views / shared / _user_info.html.erb):
<aside class="col-md-3">
<section class="user_info">
<h1><%= current_user.name %></h1>
<h1><%= current_user.derby_name %></h1>
<h2>League Affiliation: [to be developed]</h2>
<h2>[User type: will display skater, ref, and/or NSO]</h2>
<span><%= link_to "View my profile", current_user %></span>
<span>(<%= pluralize(current_user.skills.count, "skill") %>)</span>
</section>
</aside>
此部分由主页(app / views / static_pages / home.html.erb)和用户个人资料页面(app / views / users / show.html.erb)使用。我只是在用户/节目上看到了这个问题;当我测试主页上是否存在current_user.name时,它会通过。在这里进行测试:
test "logged in user profile view" do
log_in_as @user
get root_path
assert_select 'h1', text: @user.name
end
这里有什么current_user(在部分中使用)在SessionsHelper中定义为:
# Returns the current logged-in user (if any)
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(:remember, cookies[:remember_token])
log_in user
@current_user = user
end
end
end
同样,当启动服务器并手动运行测试时,它没问题,Rails可以找出current_user = @user,因此它正确显示了shared / user_info的内容。我已经多次逐行检查,以确保我确切知道它在做什么。我认为,我对会话的理解仍然有点模糊,但我确实知道session [:user_id] = user.id是基于在current_user之前在SessionsHelper中定义的方法:
# Logs in the given user
def log_in(user)
session[:user_id] = user.id
end
为什么自动测试在我手动执行时失败了?这是一个常见的测试场景/错误吗?显然,我在这里做错了什么,我该如何解决?
谢谢!