【问题标题】:Integration test with rspec with factory girl fails与工厂女孩的 rspec 集成测试失败
【发布时间】:2015-02-19 23:52:17
【问题描述】:

我一直在我的 ruby​​ on rails 项目中测试三个模型,使用 rspec 和 factory girl。 我在文件夹中有 3 个文件:spec/models.其中两个包含一个测试,第三个包含 12 个测试。我单独开始的每个测试都遵循绿点。但是如果我运行整个文件夹,只有 12 个测试的文件通过,另外两个失败并显示错误消息:

Failure/Error: @attr = attributes_for(:transaction) 
ArgumentError: 
   Factory not registered: transaction

和其他测试类似。 如果我将两个失败的文件移动到一个单独的文件夹并启动这个新文件夹 - 一个测试通过,另一个失败。但是,如果我从这两个文件中关闭 Factory girl - 都通过了。 这就是我的一些失败测试的样子:

describe Chart do
  before(:each) do
    Chart.delete_all
    @attr = attributes_for(:chart)
  end

  it "should create a new instance of chart given valid attributes" do
    Chart.create!(@attr)
  end
end

describe Transaction do
  before(:each) do
    Transaction.delete_all 
    @attr = attributes_for(:transaction)
  end

  it "should create a new instance of transaction given valid attributes" do
    Transaction.create!(@attr)
  end
end

工厂定义:

require 'factory_girl_rails'
FactoryGirl.factories.clear
FactoryGirl.define do
  factory :transaction do |u|
    u.code 54321
    u.glcode 5
    u.amount 100.0
    u.date {Date.today}
  end 
end

它看起来比某处的东西没有被清理但是什么和什么时候? 在 spec_helper 中添加代码:

config.before(:suite) do 
  DatabaseCleaner.strategy = :truncation 
end 

config.before(:each) do
  DatabaseCleaner.start
end 

config.after(:each) do 
  DatabaseCleaner.clean 
end

没有任何变化。

如果有人可以提供帮助,将不胜感激。谢谢。

【问题讨论】:

  • - 你能给出:transaction 工厂的定义吗? - 并将您的代码示例放在适当的块中,以便更容易阅读? - 你为什么不使用FactoryGirl.create(:transaction) ?这种方式一直对我有用。

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


【解决方案1】:

您是否定义了您的事务工厂?如果没有,请在您的 spec/factories.rb 文件中定义它:

FactoryGirl.define do
  factory :transaction do
    # ...
  end
end

如果有,请检查您的测试套件中是否包含 FactoryGirl::Syntax::Methods

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

否则,您需要在所有 factory_girl 方法前面加上 FactoryGirl。例如。 FactoryGirl.attributes_for(:transaction).

更新:

既然你已经定义了你的事务工厂,我会检查你的配置。您的工厂驻留在哪个文件中?你确定你已经在你的配置中包含了语法方法(检查拼写)?当你在方法前加上FactoryGirl 时会发生什么? IE。 FactoryGirl.attributes(:transaction)

【讨论】:

  • 是的,我的 spec_helper.rb 文件中有这一行。我的工厂定义看起来像 :FactoryGirl.define do factory :transaction do |u| u.code 54321 u.glcode 5 u.amount 100.0 u.date {Date.today} # initialize_with { new(attributes) } end end
  • 你应该在你的问题中包含这个工厂;在查看您的问题时,它对其他用户很有用。
  • 完成:工厂定义包含在问题中
  • 我找到了此类错误的原因,但不知道如何解决:每个测试都需要两个自己的文件:来自模型和来自工厂。由于某种原因,rails 只看到最后一个文件,并且只有一个测试(文件)从文件夹中通过。换句话说,当我开始测试文件夹时,rails 会在开始运行第一个测试之前从文件夹中的每个文件加载所有必需的文件,但是在运行测试时,rails 只看到最后一个测试所需的文件,并且只有这个测试通过。跨度>
  • 您是否在每个规范文件中都需要spec_helper
【解决方案2】:

出现此错误行的原因: FactoryGirl.factories.clear 在工厂定义中。但添加此行是为了修复先前的错误:(FactoryGirl::DuplicateDefinitionError)。 那条线确实修复了该错误,但仅用于单独的测试。因此,要修复原始错误,我必须: 1.删​​除线 FactoryGirl.factories.clear 来自工厂定义 2.包装工厂定义 如果 !FactoryGirl.factories.registered?(:transaction) 结尾 堵塞。 这完全修复了声明的错误,但可能更好地理解每个工厂调用两次的原因并删除原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多