gpt4 book ai didi

ruby-on-rails - 如何共享 GEM 中的工厂并将其用于其他项目?

转载 作者:数据小太阳 更新时间:2023-10-29 06:36:54 33 4
gpt4 key购买 nike

我有一个包含一些工厂的 gem。 gem 看起来像:

.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── db
├── lib
│ ├── models
│ │ ├── users.rb
├── pkg
├── core.gemspec
├── spec
│ ├── factories
│ │ └── users.rb
│ ├── fixtures
│ ├── helpers
│ ├── integration
│ ├── spec_helper.rb
│ ├── support│ │
│ └── unit
│ └── users_spec.rb
└── tasks

现在我通过添加类似 gem 'core', git: 'https://url.git' 的内容在另一个 Ruby 项目 (Grape) 中使用 gem。

现在一切正常,因为我可以使用 Grape 项目中的 User 模型。

但是我想使用工厂(用户),这样我就可以为 Grape 项目编写进一步的集成测试。

在 Grape 项目中,spec_helper.rb 看起来像:

require 'rubygems'
require 'bundler/setup'
Bundler.require(:default, :development)

ENV['RACK_ENV'] ||= 'test'

require 'rack/test'

require File.expand_path('../../config/environment', __FILE__)

RSpec.configure do |config|
config.mock_with :rspec
config.expect_with :rspec
config.raise_errors_for_deprecations!
config.include FactoryGirl::Syntax::Methods
end

require 'capybara/rspec'
Capybara.configure do |config|
config.app = Test::App.new
config.server_port = 9293
end

现在我的测试 'users_spec.rb' 看起来像:

require 'spec_helper'

describe App::UsersController do
include Rack::Test::Methods

def app
App::API
end

describe "/users/me" do
context "with invalid access token" do
before(:each) do
get "/api/v2/users/me"
user = build(:user)
end

it 'returns 401 error code' do
expect(last_response.status).to eq(401)
expect(user).to eq(nil)
end
end
end
end

现在,当我尝试使用 rspec spec/api/users_spec.rb 运行测试时,我得到:

我一直收到这个错误:

 Failure/Error: user = build(:user)
ArgumentError:
Factory not registered: user

任何帮助将不胜感激,因为我一直在为此努力。

最佳答案

问题是您可能没有在加载路径中公开 spec 文件夹(以及工厂)。一般来说,这是正确的做法。查你*.gemspec ,你可能有这样的东西:

s.require_paths = ["lib"]

这意味着只有 lib 下的文件使用您的 gem 的其他项目可能需要该目录。参见 http://guides.rubygems.org/specification-reference/#require_paths=

所以要解决您的问题,您需要在 lib 中放置一个文件文件夹,它“知道”您的工厂所在的位置并需要这些文件夹。所以在你的情况下,创建一个文件 lib/<your gem name>/factories.rb并添加:

GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__)))

Dir[File.join(GEM_ROOT, 'spec', 'factories', '*.rb')].each { |file| require(file) }

在另一个项目中加载工厂:

require '<your gem name>/factories'

对我来说效果很好。我唯一还没有弄清楚的是如何命名你的工厂。不确定工厂女工是否允许这样做。

关于ruby-on-rails - 如何共享 GEM 中的工厂并将其用于其他项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700345/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com