【问题标题】:How to create test data in rspec如何在 rspec 中创建测试数据
【发布时间】:2018-03-26 17:44:29
【问题描述】:

您好,我正在使用 ruby​​-2.5.0 和 Rails 5 开发 rails 应用程序。我必须测试我的 forgot_password 控制器,有一种方法可以验证数据库中是否存在电子邮件 ID。

forgot_password_controller.rb
# frozen_string_literal: true

class ForgotPasswordController < ApplicationController

    def create
        user = User.find_by_email(forgot_password_params[:email])
        unless user.blank?
      render json: {}, status: 200
    else
      render json: {}, status: 404
    end
  rescue StandardError
    render json: {}, status: 500
  end

    private

  def forgot_password_params
    permitted = %i[email]
    params.require(:data)
          .require(:attributes)
          .permit(permitted)
          .transform_keys(&:underscore)
  end
end

我想测试我的 api。我编写的单元测试如下:-

forgot_password_controller_spec.rb
# frozen_string_literal: true

require 'rails_helper'

describe ForgotPasswordController do
  before do
    User.create!(email: 'xyz@gmail.com',
                 password: 'pass',
                 password_confirmation: 'pass')
  end

  describe 'POST create' do
    subject { post :create, params: params }

    context 'when email is found' do
      let(:params) do
        { data: { attributes: { email: 'xyz@gmail.com' } } }
      end

      it { is_expected.to have_http_status(200) }
    end

    context 'when email is not found' do
      let(:params) do
        { data: { attributes: { email: 'xyz2@gmail.com' } } }
      end

      it { is_expected.to have_http_status(404) }
    end

    context 'when wrong params passed' do
      let(:params) do
        { data: '' }
      end

      it { is_expected.to have_http_status(500) }
    end
  end
end

现在我想用 'let' 创建测试数据 喜欢

let(:user) { instance_double('user') }
let(:save_result) { true }

如何创建用户让请帮助我。提前致谢。

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec


    【解决方案1】:

    我会考虑使用 FactoryBot aka FactoryGirl,因为它可以更轻松地编写这些内容。但是对于您的情况,这应该是您要寻找的:

    let(:user) { User.create!(email: 'xyz@gmail.com', password: 'pass', password_confirmation: 'pass') }
    

    如果您有 FactoryBot,您可以通过以下方式简化:

    let(:user) { create(:user) }
    

    或者可能是为了更好的性能,如果您实际上不需要创建记录而是简单地构建:

    let(:user) { build_stubbed(:user) }
    

    【讨论】:

    • 谢谢,但我没有使用 FactoryBot 我也试过 let(:user) { User.create!(email: 'xyz@gmail.com', password: 'pass', password_confirmation: 'pass' ) } 芽没用。它不会创建任何用户。
    • 我也试过 let!(:user) { User.create email: 'saddam@mivi.com.au', password: 'password',password_confirmation: 'password' } 它有效,但我得到了一个错误 RSpec/LetSetup: 不要使用 let!用于测试设置。
    • 这听起来像是 rubocop 在抱怨,而不是使用 let(),只需在块内声明常规 ruby​​。见rubydoc.info/gems/rubocop-rspec/1.7.0/RuboCop/Cop/RSpec/…
    • 嘿,我已经创建了一个范围来查找带有电子邮件的用户,但是当我运行我的测试用例时,即使没有带有 ID 的记录,它也总是能找到用户。请帮忙
    • 不确定你的意思。你能用新代码更新你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多