我在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
没有任何改变。
如果有人能提供帮助,我将不胜感激。感谢。
答案 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) 结束 块。 这是完全修复声明的错误,但可能更好地了解每个工厂调用两次并删除原因的原因。