从初始化属性厂切换时rspec的测试失败(rspec test failure when switc

2019-09-16 17:27发布

这是没有意义的我,希望有人可以提供帮助。 创建使用工厂(看起来相似的测试通过)的用户,当我得到一个测试失败。

在我的测试user_spec.rb文件,用户最初是这样创建的。 使用这种方法的初始化,通过了所有测试。


用户创建

user_spec.rb(无工厂)

describe User do

  before do
  @user = User.new(name: "Example User", email: "user@example.com", 
                   password: "foobar", password_confirmation: "foobar", 
                   username: "username")
  end

大多数其他测试的应用程序使用的工厂。 所以,决定与调用原厂更换以上。

user_spec.rb(与工厂)

describe User do

  before do
  @user = FactoryGirl.create(:user)
  end

工厂看起来是这样的。

factories.rb

FactoryGirl.define do
      factory :user do
        sequence(:name)  { |n| "Person #{n}" }
        sequence(:email) { |n| "person_#{n}@example.com" }
        password              "foobar"
        password_confirmation "foobar"
        sequence(:username) { |n| "username_#{n}" }

测试失败

下面是使用工厂创建用户时,测试失败。

user_spec.rb

Failures:

  1) User when email address is already taken 
     Failure/Error: it { should_not be_valid }
       expected valid? to return false, got true
     # ./spec/models/user_spec.rb:101:in `block (3 levels) in <top (required)>'

Finished in 12.61 seconds
178 examples, 1 failure, 2 pending

测试

下面是切换到出厂时未通过测试的一部分。

describe "when email address is already taken" do
    before do
      user_with_same_email = @user.dup
        user_with_same_email.email = @user.email.upcase
        user_with_same_email.save
    end

    it { should_not be_valid }
  end

检查用户和USER.DUP的

我首先想到的是可能使用在工厂创建的用户是造成问题的.dup。 这里是@user和@ user.dup当从它们在上述(测试用的输出通过将线puts @user.inspectputs user_with_same_email.inspect到描述块。这两种的puts是后user_with_same_email.save )。

没有出厂(测试通过)

@用户

#<User id: nil, name: "Example User", email: "user@example.com", 
created_at: nil, updated_at: nil, 
password_digest: "$2a$04$I/71i.fpTwfp4PqRwAvU4eUEjEkW/wubx6uVBqfNBShq...", 
remember_token: nil, admin: false, username: "username">

user_with_same_email

#<User id: 1178, name: "Example User", email: "USER@EXAMPLE.COM", 
created_at: "2012-04-24 06:01:07", updated_at: "2012-04-24 06:01:07", 
password_digest: "$2a$04$I/71i.fpTwfp4PqRwAvU4eUEjEkW/wubx6uVBqfNBShq...", 
remember_token: "rMS9jM0d4lobLc-A-pTTqA", admin: false, username: "username">

与工厂(测试失败)

@用户

#<User id: 739, name: "Person 67", email: "person_67@example.com", 
created_at: "2012-04-24 05:54:28", updated_at: "2012-04-24 05:54:28", 
password_digest: "$2a$04$n4tToBVM2elz92cfHPKvte6dfHSBj4jDxG.w6DyKtGUR...", 
remember_token: "fy2iifmhXVTFa1__d1dBJg", admin: false, username: "username_67">

user_with_same_email

#<User name: "Person 67", email: "PERSON_67@EXAMPLE.COM", 
created_at: nil, updated_at: nil, 
password_digest: "$2a$04$n4tToBVM2elz92cfHPKvte6dfHSBj4jDxG.w6DyKtGUR...", 
remember_token: "fy2iifmhXVTFa1__d1dBJg", admin: false, username: "username_67">

上面有什么突出的是@user尚未保存不使用的工厂,使用工厂@user时保存,而。 我只是没有看到这如何影响在这种情况下,测试。

任何帮助,将不胜感激。 谢谢!

(上面的代码来自迈克尔·哈特尔的Rails的教程,我工作的一部分的应用程序功能的扩展 ,他提到在教程结束。)

Answer 1:

工厂把记录在数据库中。 User.new没有,直到它被保存。 最初的测试不检查user_with_same_email被创建,不如说“它”(主题{@user})不能被创建,因为邮件的存在。 让您换到@user后,我不得不重写测试:

describe "when email address is already taken" do
  let (:user_with_same_email)  { @user.dup }

  specify { user_with_same_email.should_not be_valid }
end


Answer 2:

感谢埃里克。 建立在您的测试....

原始测试还测试对于壳体灵敏度以及唯一性。 该测试通过,似乎这样的伎俩。 有什么想法吗?

describe "when email address is already taken" do
  let(:user_with_same_email) { @user.dup }
  before do 
    user_with_same_email.email = @user.email.upcase 
    user_with_same_email.save
  end
  specify { user_with_same_email.should_not be_valid }
end


文章来源: rspec test failure when switching from initializing attributes to Factory