Ruby on Rails - 在测试用例

时间:2017-04-07 08:51:34

标签: ruby-on-rails rspec capybara rspec-rails

我对单元测试真的很陌生,我试图绕过它。所以我有一个文章表单的情况,用户可以输入titledescription并点击Create Article文章应该创建,但只有登录用户可以执行此操作所以我需要测试此

因为我是新手,所以这就是我的想法,

  1. 我将首先创建一个用户
  2. 将其保存到会话,就像系统如何检查用户是否已登录(但我认为它不是浏览器,因此这个逻辑可能不起作用),然后我如何以登录用户身份提交表单?
  3. 这是我的尝试

    require 'rails_helper'
    
        RSpec.feature 'adding article' do
          scenario 'allow user to add an article' do
            @user = User.create(:email => "saadia1@clickteck.com", :password => 'password', :username => 'saadia1')
            session[:user_id] = @user.id
    
            visit new_article_path
    
            # @article = Article.user.to eql(@user = User.find_by(id: 6))
            fill_in "Title", with: "My Title"
            fill_in "Description", with: "My description"
    
    
            click_on("Create Article")
    
            expect(page).to have_content("My Title")
            expect(page).to have_content("My description")
    
          end
        end
    

    当我运行命令rspec spec/features/add_article_spec.rb

    我看到了

      

    故障:

         

    1)添加文章允许用户添加文章        失败/错误:会话[:user_id] = @ user.id

     NameError:
       undefined local variable or method `session' for #<RSpec::ExampleGroups::AddingArticle:0x007f89285e32e8>
     # ./spec/features/add_article_spec.rb:6:in `block (2 levels) in <top (required)>'
    
         

    以0.0197秒结束(文件加载1.35秒)1   例如,1次失败

         

    失败的例子:

         

    rspec ./spec/features/add_article_spec.rb:4#添加文章允许   用户添加文章

    所以我的问题是我如何添加一篇文章作为登录用户?我真的很感激你的帮助。

2 个答案:

答案 0 :(得分:0)

你是否正在使用设计进行身份验证如果是,设计提供了一些帮助测试,也包括你的rail_helper.rb中的这一行

config.include Devise::Test::ControllerHelpers, :type => :controller 这将帮助您使用sign_in辅助设计方法,并且您不需要像当前那样使用会话,请参阅link了解更多信息

答案 1 :(得分:0)

这就是我最终创建一个测试用例的方法,因为这是我的第一个测试用例之一,我不确定如何改进它,所以随时可以查看它

require 'rails_helper'

RSpec.feature 'adding article' do    
  scenario 'allow user to add an article' do 
    user = FactoryGirl.create(:user)
    visit login_path
    fill_in 'Email', with: user.email
    fill_in 'Password', with: user.password
    click_button 'Log in'
    expect(page).to have_content('You have successfully logged in')


    visit new_article_path

    fill_in "Title", with: "My Title"
    fill_in "Description", with: "My description"


    click_on("Create Article")

    expect(page).to have_content("My Title")
    expect(page).to have_content("My description")

  end
end

这是我的工厂

# spec/factories/users
FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "user#{n}" }
    password 'password'
    sequence :email do |n|n
    "user_#{n}@example.com"
    end
  end
end
  

在0.4176秒内完成(文件加载2.54秒)1   例如,0次失败

我仍然想知道是否可以在另一个场景中登录用户,或者所有这些都必须是一个场景的一部分。