如何使用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的新手
答案 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
(注意FactoryGirl
是renamed 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