与工厂女孩的rspec集成测试失败

时间:2015-02-19 23:52:18

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

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

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

和其他测试相似。 如果我将两个失败的文件移动到一个单独的文件夹并启动这个新文件夹 - 一个测试通过而另一个失败。但是,如果我从这两个文件关闭工厂女孩 - 两个都通过。 这是我的一些失败测试的样子:

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

没有任何改变。

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

2 个答案:

答案 0 :(得分: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为方法添加前缀时会发生什么?即FactoryGirl.attributes(:transaction)

答案 1 :(得分:0)

此错误行的原因:     FactoryGirl.factories.clear 在工厂定义。但添加了这一行来修复以前的错误:(FactoryGirl :: DuplicateDefinitionError)。 并且该行确实修复了该错误,但仅用于单独测试。所以要解决原始错误,我必须: 1.删​​除线条     FactoryGirl.factories.clear来自工厂定义 2.包装工厂定义     if!FactoryGirl.factories.registered?(:transaction)     结束 块。 这是完全修复声明的错误,但可能更好地了解每个工厂调用两次并删除原因的原因。