Autotest和Factory Girl的验证问题

时间:2011-01-04 22:57:52

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

我遇到了自动测试的问题。在我的用户模型中是用户名&电邮地址独特。当我启动自动测试时,一切正常。在第二轮,从自动测试,我有一个

  

验证失败:已收到电子邮件,已取用用户名

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

这是我的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

唯一两个不起作用的测试是在“唯一值”上下文中。所有其他测试都没有错误。

由于

4 个答案:

答案 0 :(得分:1)

这正是我刚遇到的问题 - 并且有一种奇怪的经历,如果我只是运行“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

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

答案 1 :(得分:1)

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

如果您运行: rake db:test:prepare 在自动测试之前,它还会发生吗?

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

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

希望这有帮助。

答案 2 :(得分:0)

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

config.use_transactional_fixtures = false

这应该是:

config.use_transactional_fixtures = true

或者,如果您不想使用事务性灯具,则应在测试中使用before(:each)函数:

before :each do
  User.destroy_all
end

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

答案 3 :(得分:0)

我遇到了一个非常类似的问题,我在这个帖子上尝试了几个没有运气的建议。然而,我确实通过在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