自动测试失败,但在我手动尝试时通过

时间:2015-08-05 17:48:57

标签: ruby-on-rails testing

我已经对橡皮鸭进行了几次测试,我仍然空白。

编辑:在那里发布了错误的代码块。现在已经更新了正确的代码并分析了我所看到的内容。现在感觉很聪明。谢谢,@ 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

为什么自动测试在我手动执行时失败了?这是一个常见的测试场景/错误吗?显然,我在这里做错了什么,我该如何解决?

谢谢!

0 个答案:

没有答案
相关问题