从灯具切换到工厂女孩

时间:2011-02-20 08:59:52

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

Rails 3.0.3 ....

我刚刚开始与Factory Girl合作,在标准灯具方法方面收效甚微。我已经从test / test_helper.rb文件中注释掉fixtures :all并创建了一个工厂文件。

我的问题是序列功能似乎不起作用:

# test/factories.rb
Factory.sequence :clearer_name do |n|
   "Clearer_#{n}"
end

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

我的(功能)测试与标准略有不同:

require 'test_helper'

class ClearersControllerTest < ActionController::TestCase
   setup do
      @clearer = Factory.create(:clearer)
   end

test "should get index" do
   get :index
   assert_response :success
   assert_not_nil assigns(:clearers)
 end

 test "should get new" do
   get :new
   assert_response :success
 end

 test "should create clearer" do
   assert_difference('Clearer.count') do
     post :create, :clearer => @clearer.attributes
   end

   assert_redirected_to clearer_path(assigns(:clearer))
 end

当我运行rake test时,我得到:

test_should_create_clearer(ClearersControllerTest):
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: column name is not unique: INSERT INTO "clearers" ("active", "updated_at", "name", "created_at") VALUES ('t', '2011-02-20 08:53:37.040200', 'Clearer_1', '2011-02-20 08:53:37.040200')

......好像它没有继续顺序。

任何提示?

谢谢,

更新:继承我的测试文件:

#clearers_controller_test.rb
require 'test_helper'
class ClearersControllerTest < ActionController::TestCase
  setup do
    @clearer = Factory.create(:clearer)
  end

  test "should create clearer" do

    assert_difference('Clearer.count') do
      # does not work without this:
      Clearer.destroy_all 
      post :create, :clearer => @clearer.attributes
    end
end

我可以通过将Clearer.destroy_all放在测试方法的顶部来实现这一点,如图所示,但这感觉不对。

3 个答案:

答案 0 :(得分:1)

我明白了 - 在你的设置中,你正在创建一个更清晰的实例。 Factory.create方法构建并保存新记录并返回它。

问题是,您正在尝试在“应该创建更清晰”的测试中创建另一个实例,但是您正在重新使用现有实例的属性。

如果您希望Factory返回新属性(以及下一个名称序列),您需要询问它是否有新属性:

test "should create clearer" do
  assert_difference('Clearer.count') do
    post :create, :clearer => Factory.attributes_for(:clearer)
  end
end

您应该只在现有记录的上下文中使用现有的@clearer实例,而不是在想要新记录的位置。

答案 1 :(得分:0)

我猜你没有开始使用新数据库。有很多原因可能会发生这种情况,但您可以在创建之前在设置函数中添加Clearer.destroy_all来验证问题。

答案 2 :(得分:0)

在运行时计算的序列和其他属性值需要是proc,而不是静态值。

变化:

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

为:

Factory.define :clearer do |f|
   f.name {Factory.next(:clearer_name)}
end