如何测试是否在RSpec中使用FactoryGirl创建了新记录?

时间:2017-12-11 05:00:11

标签: ruby-on-rails ruby rspec factory-bot

如何使用FactoryGirl为User.find_user_id类方法编写测试?

Class User < ActiveRecord::Base

   def self.find_user_id (name)
     result = User.find_or_create_by(name: name)
    return result.id
   end
end

编辑:我第一次没有弄清楚自己。我在测试中想要的是,当我致电User.find_user_id时,线User.find_or_create_by被击中。

我使用了expect(User).to received(:find_or_create_by),但这会使result = nil和返回语句return result.id导致错误undefined method 'id' for nil:NilClass。我正在考虑使用FactoryGirl创建一个新记录,所以我不会收到此错误消息。但我不确定这是否是正确的方法,因为我是RSpec / Rails的新手

3 个答案:

答案 0 :(得分:2)

您可以在导轨模型中使用valid?来检查模型规格中的factoryGirl create功能

RSpec.describe User, :type => :model do
  let(:user) { FactoryGirl.create(:user) }
  it { is_expected.to be_valid }
end

答案 1 :(得分:1)

1.您需要User模型的工厂,如下所示:

FactoryGirl.define do
  factory :user do
    name: 'Stefen'
  end
end

2.由于您的类方法find_user_id返回将name传递给该方法的用户的ID。因此,规格可以写成如下:

describe '.find_user_id' do

  before do
    @user = FactoryGirl.create(:user)
  end

  it 'should find user id by name' do
    find_user_id(@user.name).should eq @user.id
  end

end

3.在rspec中,它应验证您的类方法find_user_id是否返回id

答案 2 :(得分:1)

FactoryBot(注意FactoryGirlrenamed a couple of weeks ago)有一个内置的linter,以确保所有工厂生成有效的实例。请参阅其文档中的Linting Factories

如何使用linter的一个非常简单的示例可能如下所示:

# spec factory_linter_spec.rb
require 'spec_helper'

Rspec.describe 'FactoryBot' do
  it 'creates valid instances' do
    FactoryBot.lint
  end
end