2017-10-29 272 views
0

麻烦我正在做我的第一个Rails应用程序,所以这可能是基本的。与Rails控制器(集成?)测试

在我的用户配置文件中,我想让用户添加标题和说明。我让他们User模型的属性,并添加这routes.rb

resources :users do 
    member do 
     post 'update_description' 
    end 
    end 

同样的方法(不写还)会处理这两个属性。为了练习TDD,我想编写一个测试,简单地表明,如果用户提交标题,则控制器将其保存到数据库中。我认为这将是一个整合测试,但我无法找到正确的路径。 (应该它是一个集成测试吗?)但是,随着研究,我设法写一个工作post语句在一个相关的控制器测试文件。这里的控制器测试:

test "profile submits new title and description successfully" do 
    log_in_as(@user) 
    get :show, id: @user 
    assert_nil @user.title 
    post :update_description, id: @user, params: { title: "Lorem ipsum" } 
    # Next: 
    # @admin.reload.title 
    # assert @admin.title == "Lorem ipsum" 
    # assert_template 'users/show' 
    # Etc. 

    end 

这引起以下错误:

ERROR["test_profile_submits_new_title_and_description_successfully", UsersControllerTest, 2017-10-22 21:42:52 -0400] 
test_profile_submits_new_title_and_description_successfully#UsersControllerTest (1508722972.17s) 
ActionView::MissingTemplate:   ActionView::MissingTemplate: Missing template users/update_description, application/update_description with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in: 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates" 
      * "/home/globewalldesk/startthis/app/views" 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/app/views" 

      test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 
     test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 

我推测,这意味着Rails正在寻找一个视图文件,并不能找到一个,但我没有看到为什么post :update_description它寻找一个视图...我认为这将张贴信息没有一个视图(我有一个类似的路径,以相同的方式,没有看法)。 update_description方法在Users控制器中。我做了很多研究,但我无法弄清楚我做错了什么。帮帮我! TIA。

回答

1

您编写测试的方式看起来像集成测试。但我个人会建议编写一个系统测试。因为我看到你创建一个update_description成员路由只是为了更新用户对象?那没有必要 - 您的User资源已有editupdate操作,因此您可以删除该成员路由。

集成测试用于检查工作流程以及如何交互应用程序的不同部分。虽然系统检查是针对用户交互的,但基本上你会检查用户在浏览器中执行的操作。此外,在我看来用这种技术编写测试要简单得多(至少在这个级别上)。

所以,你的系统测试会是什么样子:

setup do 
    log_in_as(@user) // or what ever code to visit login page and login user 
end 

test "profile submits new title successfully" do 
    visit edit_user_path 

    fill_in "Title", with: "Lorem ipsum" 

    click_on "Save" 

    assert_response :redirect 
    follow_redirect! 
    assert_select "Title", text: "Lorem ipsum" 
end 

这假设用户提交了表格后,应用重定向到user_path(@user)(显示页)。

,还是集成测试看起来是这样的:

test "profile submits new title successfully" do 
    log_in_as(@user) // or what ever code to login user 
    get "/user/#{@user.id}/edit" 
    assert_response :success 

    updated_title = "Lorem ipsum" 

    patch :update, user: { id: @user.id, title: updated_title } 

    assert_response :redirect 
    follow_redirect! 
    assert_response :success 
    assert_select "Title", text: "Lorem ipsum" 
end 

注意 - 我没有测试过这一点,我用的水豚等工具,但不MINITEST。但在这简单这应该工作,我认为。

并检查docs如果您还没有这么做了..

+0

哇,我一直在寻找网上很多过去几天的这样做的JavaScript测试。我听说过的一个测试框架是Capybara,在这里你链接到Rails Guides页面,它说:“系统测试使用Capybara作为基础。”你知道我使用的是Rails 4.2.2吗?无论如何,我会尝试你的解决方案,至少对于集成测试。系统测试看起来是另一件要学习的东西(很快)。谢谢! – globewalldesk

+0

所以,下面是导致我创建'update_description'路线而不是依赖'Users#edit'的问题。用户编辑页面(位于'users//edit')具有名称和密码。个人资料页面位于'users/'处。我想让用户可以添加profile-y类型的信息,如标题,描述和接收消息。所以我想......那些是'用户'属性,对吧?但是我已经有了一个'edit'动作来处理用户名和密码信息。所以我只需制作一条新路线来处理用户信息的编辑。 有没有更好的解决方案? – globewalldesk

+0

感谢您的帮助。我弄错了两件事。首先,在集成测试中,我使用了错误的“post”行。这工作: 'post“/users/#{@non_admin.id}/update_description”, PARAMS:{title:“我是不断悲伤的人。” }' 而另一个问题是'用户#update_description'操作应该加载_some_视图(我还没有写出方法!)。我只是添加了'redirect_to user_path(@user)',它工作! – globewalldesk