0

我有一些随机失败的测试,大约。20% 的时间。这意味着在不更改代码的情况下,每次我运行测试 5 次中的 1 次都会失败,并出现“工厂未注册”错误。这很奇怪.. :(

这是控制台输出:

Failures:

  1) Unit#new_from_string returns factor for metric conversions
     Failure/Error: FactoryGirl.create :taza
     ArgumentError:
       Factory not registered: taza
     # ./spec/models/unit_spec.rb:29:in `block (2 levels) in <top (required)>'

Finished in 0.29619 seconds
4 examples, 1 failure

Failed examples:

rspec ./spec/models/unit_spec.rb:22 # Unit#new_from_string returns factor for metric conversions

Randomized with seed 61727

这是代码:

文件:“unit_spec.rb”

require 'spec_helper'

describe Unit, "#new_from_string" do
  it "parses the string and returns a Unit object" do
    [some tests...]

    FactoryGirl.find_definitions
    u = FactoryGirl.create :taza
    FactoryGirl.create :tbsp

    [tests...]
  end

  it "returns factor for metric conversions" do
    [tests not involving factory girl...]

    # the following is line 29, that fails
    FactoryGirl.create :taza

    [tests...]   
  end
end

文件“spec/factories/units.rb”:

FactoryGirl.define do
  factory :taza , :class => CustomUnit do
    singular 'taza'
    plural 'tazas'
    physical_type Unit::VOLUME
    equivalence_factor 200
    equivalence_unit 'ml'
  end

 [other factories...]      
end
4

1 回答 1

4

我认为问题出在这条线上

FactoryGirl.find_definitions

实际上,当您的工厂位于正确的目录中(我看到是)并且您放入gem factory_girl_railsGemfile 时,不需要此行。

我认为,有 20% 的时间,第二个测试首先运行。此时没有Factory的定义,测试失败。另一个测试有这样的定义并通过。在其他时候,第一次测试首先运行,所以定义存在。

我的建议:

  1. 确保你有factory_girl_rails,而不是factory_girl在 Gemfile 中。
  2. 删除该定义行。
  3. spec/factories[可选但推荐]如果您没有太多工厂,请将所有定义放在一个文件中并删除所有其他工厂文件。这将更容易管理。
于 2013-08-26T04:22:03.547 回答