gpt4 book ai didi

ruby-on-rails - RSpec 未加载 ControllerMacros 方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:29 26 4
gpt4 key购买 nike

我已经添加了一个 ControllerMacro 但我的规范中没有提供该方法。我的规范将失败:

NoMethodError: undefined method `attributes_with_foreign_keys' for FactoryGirl:Module

我正尝试在 this 之后执行此操作Github 上的讨论。我看过 other类似的问题,但大多数指向使用 config.include ControllerMacros, :type => :controller 而不是我正在做的 config.extend ControllerMacros, :type => :controller已经。

现在我知道 controller_macros.rb 文件在开始测试时被加载,因为我已经通过 RubyMine 的调试器运行了规范,但我不明白为什么该方法不可用!

spec_helper.rb

require 'simplecov'
SimpleCov.start 'rails'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'email_spec'
require 'rspec/autorun'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
config.include(EmailSpec::Helpers)
config.include(EmailSpec::Matchers)
config.include ControllerMacros, :type => :controller

config.include FactoryGirl::Syntax::Methods

config.use_transactional_fixtures = true

config.infer_base_class_for_anonymous_controllers = false

config.order = "random"

config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end

spec/support/macros/controller_macros.rb

module ControllerMacros
def attributes_with_foreign_keys(*args)
FactoryGirl.build(*args).attributes.delete_if do |k, v|
["id", "type", "created_at", "updated_at"].member?(k)
end
end
end

此示例 Controller 规范:

describe "POST create" do
describe "with valid params" do
it "creates a new Course" do
expect {
#post :create, course: FactoryGirl.build(:course)
post :create, course: FactoryGirl.attributes_with_foreign_keys(:course)
}.to change(Course, :count).by(1)
end

最佳答案

失败原因:

您定义的宏是模块中的一个方法。您要求 Rspec 包含该模块,因此该方法可用于 Rspec 的实例,其使用方式应类似于 describeit 等。

但是,您将此方法用作 FactoryGirl 的类方法。显然这是行不通的。

解决方案。

看来你想有一个方便的方法来快速构建一组在特殊情况下模型的预定义属性。

这个逻辑最好不要是一个“宏”,因为最好使用FactoryGirl作为一个集中的地方来存储所有关于模型的逻辑。

所以,最方便的方法是,在你的普通工厂之外,为这种情况定义一个特殊的工厂,比如说 foo,里面有你需要的所有关联和其他逻辑,并从其他普通工厂继承工厂。

如果它的名称是 foo,那么您可以轻松构建 foo 属性的散列,例如 FactoryGirl.attributes_for :foo

关于ruby-on-rails - RSpec 未加载 ControllerMacros 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20174648/

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