【问题标题】:Validation problem with Autotest and Factory GirlAutotest 和 Factory Girl 的验证问题
【发布时间】:2011-06-03 17:09:05
【问题描述】:

我对自动测试有疑问。在我的用户模型中,用户名和电子邮件地址是唯一的。当我开始自动测试时,一切正常。在第二轮,通过自动测试,我有一个

验证失败:电子邮件已被占用,用户名已被占用

只有两次测试出错。我不明白为什么,我使用 factorygirl 和 sequenze,这应该每次生成一个新的用户名。

这是我的 rspec2 文件:

describe User do

  specify {  Factory.build(:user).should be_valid }

  context "unique values" do

    before :all do
       @user = Factory.create(:user)
    end


    it "should have an unique email address" do
       Factory.build(:user, :email  => @user.email).should_not be_valid
    end

    it "should have an unique username" do
       Factory.build(:user, :username  => @user.username).should_not be_valid
    end

  end


  context "required attributes" do

    it "should be invalid without an email address" do
       Factory.build(:user, :email => nil).should_not be_valid
    end

    it "should be invalid without an username" do
       Factory.build(:user, :username  => nil).should_not be_valid
    end

    it "should be invalid without an password" do
       Factory.build(:user, :password  => nil).should_not be_valid
    end

    it "should be invalid without an address" do
        Factory.build(:user, :address  => nil).should_not be_valid
    end


  end
end

工厂:

Factory.sequence :username do |n|
  "Outfit#{n}er"
end

Factory.sequence :email do |n|
  "user#{n}@example.com"
end

Factory.define :user do |u|
  u.username              { Factory.next :username }
  u.email                 { Factory.next :email }
  u.password              'secret'
  u.phone_number          '02214565854'
  u.association :address, :factory => :address
end

Factory.define :confirmed_user, :parent => :user do |u|
  u.after_build { |user| user.confirm! }
end

唯一两个不起作用的测试是在“唯一值”上下文中。所有其他测试均正常运行。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby factory-bot rspec2 autotest


    【解决方案1】:

    问题可能出在您的配置文件中。您的规范配置文件(可能是 spec_helper.rb)中有一行内容为:

    config.use_transactional_fixtures = false

    这应该是:

    config.use_transactional_fixtures = true

    或者,如果您不想使用事务性固定装置,您应该在测试中使用 before(:each) 函数:

    之前:每个都做 用户.destroy_all 结尾

    或者,我将the Sham gem 用于我的工厂,因为它与非事务性固定装置和序列更兼容。

    【讨论】:

    • 感谢您的回答。但我的 spec_helper.rb 中有“config.use_transactional_fixtures = true”
    【解决方案2】:

    这正是我刚刚遇到的问题——并且有一个奇怪的经历,如果我只是运行“rake spec”,这个问题似乎不会发生。

    在没有找到明显的答案后,我确实尝试了一些似乎解决了问题的方法!如果您使用的是 FactoryGirl,似乎在 before() 块中设置类变量是罪魁祸首。

    我有一些非常相似的东西:

    factory :widget do
      sequence(:name) { |n| "widget#{n}" }
    end
    

    然后:

    describe Widget do
      before(:each) { @widget = FactoryGirl.create(:widget) }
      it ...yadda yadda...
        @widget.foo()
      end
    end
    

    自动测试会发现唯一性约束问题。我将 rspect 测试更改为:

    describe Widget do
      let(:widget) { FactoryGirl.create(:widget) }
      it ...yadda yadda...
        widget.foo()
      end
    end
    

    ...唯一性约束问题消失了。不知道为什么会发生这种情况,而且它似乎不应该发生,但可能是一个可行的解决方案。

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,因为在一些测试后没有正确清除数据库。

      如果你运行: 耙分贝:测试:准备 在自动测试之前,它仍然会发生吗?

      我最终通过隔离哪些测试没有被清除并修复它们(或删除它们)来解决它。抱歉,我不记得出了什么问题,但它有一些错误导致它。

      哦,我在没有 spork 的情况下运行它,这样我就可以看到我的记录器消息与结果混合在一起。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        我遇到了一个非常相似的问题,我尝试了这个线程上的几个建议,但没有成功。但是,我确实通过将以下内容添加到我的 spec_helper.rb 来修复它:

        # Clean up the database
          require 'database_cleaner'
           config.before(:suite) do
             DatabaseCleaner.strategy = :truncation
             DatabaseCleaner.orm = "mongoid"
          end
        
          config.before(:each) do
            DatabaseCleaner.clean
          end
        

        别忘了将 DatabaseCleaner gem 添加到您的 gemfile 中

        【讨论】:

          猜你喜欢
          • 2012-06-12
          • 1970-01-01
          • 2015-04-29
          • 2015-11-14
          • 1970-01-01
          • 1970-01-01
          • 2014-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多