我正在尝试使用RSpec编写测试。为此,我需要使用factory_bot_rails
创建一个工厂。
问题是,我要创建的工厂来自服务,这里:
app/services/scim/scim_provider.rb
module Scim
class ScimProvider
attr_reader :identity_provider
include Rails.application.routes.url_helpers
def initialize(identity_provider)
@identity_provider = identity_provider
end
...
end
end
我尝试了多种方式来创建它,这是我最后的方法:
FactoryBot.define do
factory :scim_idp,class: IdentityProvider do
name { Faker::Lorem.word }
config { '{"scim": {"auth_mode": "http_header","bearer_token": "lzifudgvzeliugvzeligvezlrigf"}}' }
identifier { Faker::Internet.uuid }
provisioning_type { 'scim' }
sso_type { 'saml' }
end
factory :scim_provider,class: Scim::ScimProvider.new(identity_provider: :scim_idp) do
config { '{"scim"=>{"auth_mode"=>"http_header","bearer_token"=>"qdfetRx8c6qXFYepNeRvrk1pH6cheb6EcYpBzXmRabY4JsjTbrFDopsXDgSkD1Zkct5LEMptkfyggrcsjrFmGAcRemmffjJMdofQLKuCnw8xUSBSbdaQk7WrRb7JurH4Xdvu3Joi3S6GuRXkiCn8uPHQHwusqX4dp5GaSqXr5vWYwsfe262bhnmnWZ6EebLnEk8DRrybS4ay4XMr5M8n83GjxgF3kk4GighhafeFyABdiD7qm7AUiKt751bCs7hi"}}' }
end
end
然后在spec/controllers
中,我有一个identity_provider_controller_spec.rb
:
require 'rails_helper'
RSpec.describe IdentityProvidersController,type: :controller do
before(:all) do
@scim_idp = create(:scim_idp)
@scim_provider = create(:scim_provider)
end
describe "ScimProvider" do
it "is created and is associated to an identity_provider" do
expect(@scim_provider.identity_provider).not_to be_nil
end
end
describe "reset_auth_mode" do
context "the bearer token changes when reset_auth_mode" do
it "has an auth_mode and a bearer_token" do
expect(@scim_provider.auth_mode).not_to be_nil
expect(@scim_provider.bearer_token).not_to be_nil
end
it "can reset auth mode" do
# not yet implemented
end
it "has a different bearer token when resetting auth mode" do
# not yet implemented
end
end
end
end
我们运行规范,出现以下错误:
FFFF
Failures:
1) IdentityProvidersController ScimProvider is created and is associated to an identity_provider
Failure/Error: @scim_provider = create(:scim_provider)
NameError:
wrong constant name #<Scim
我想问题出在工厂。不幸的是,factory_bot_rails文档未提及有关服务类对象创建的任何内容。