Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Hartls rails教程第6章的Rspec测试失败_Ruby On Rails_Rspec_Railstutorial.org - Fatal编程技术网

Ruby on rails Hartls rails教程第6章的Rspec测试失败

Ruby on rails Hartls rails教程第6章的Rspec测试失败,ruby-on-rails,rspec,railstutorial.org,Ruby On Rails,Rspec,Railstutorial.org,我遇到了这些失败,我不知道该去哪里解决这个问题。我已经搜索了这个网站,但找不到其他有我问题的人。根据Hartl教程,所有测试都应该通过 失败: C:\Sites\rails_projects\sample_app>bundle exec rspec spec Rack::File headers parameter replaces cache_control after Rack 1.5. ←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←

我遇到了这些失败,我不知道该去哪里解决这个问题。我已经搜索了这个网站,但找不到其他有我问题的人。根据Hartl教程,所有测试都应该通过

失败:

  C:\Sites\rails_projects\sample_app>bundle exec rspec spec
Rack::File headers parameter replaces cache_control after Rack 1.5.
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[32m.←[0m←[32m.←[0m

Failures:

  1) when email address is already taken
     ←[31mFailure/Error:←[0m ←[31muser_with_same_email = @user.dup←[0m
     ←[31mTypeError:←[0m
       ←[31mcan't dup NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:104:in `dup'←[0m
←[36m     # ./spec/models/user_spec.rb:104:in `block (2 levels) in <top (require
d)>'←[0m

  2) when name is too long
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.name = "a" * 51 }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `name=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:76:in `block (2 levels) in <top (required
)>'←[0m

  3) when password is not present
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password = @user.password_confi
rmation = " " }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:55:in `block (2 levels) in <top (required
)>'←[0m

  4) when password confirmation is nil
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password_confirmation = nil }←[
0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:65:in `block (2 levels) in <top (required
)>'←[0m

  5) when email format is valid should be valid
     ←[31mFailure/Error:←[0m ←[31m@user.email = valid_address←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `email=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:97:in `block (3 levels) in <top (required
)>'←[0m
←[36m     # ./spec/models/user_spec.rb:96:in `each'←[0m
←[36m     # ./spec/models/user_spec.rb:96:in `block (2 levels) in <top (required
)>'←[0m

  6) when password doesn't match confirmation
     ←[31mFailure/Error:←[0m ←[31mbefore {@user.password_confirmation = "mismatc
h" }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:60:in `block (2 levels) in <top (required
)>'←[0m

  7) when name is not present
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.name = " " }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `name=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:71:in `block (2 levels) in <top (required
)>'←[0m

  8) when email format is invalid should be invalid
     ←[31mFailure/Error:←[0m ←[31m@user.email = invalid_address←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `email=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:87:in `block (3 levels) in <top (required
)>'←[0m
←[36m     # ./spec/models/user_spec.rb:86:in `each'←[0m
←[36m     # ./spec/models/user_spec.rb:86:in `block (2 levels) in <top (required
)>'←[0m

Finished in 2.42 seconds
←[31m30 examples, 8 failures←[0m

Failed examples:

←[31mrspec ./spec/models/user_spec.rb:109←[0m ←[36m# when email address is alrea
dy taken ←[0m
←[31mrspec ./spec/models/user_spec.rb:77←[0m ←[36m# when name is too long ←[0m
←[31mrspec ./spec/models/user_spec.rb:56←[0m ←[36m# when password is not present
 ←[0m
←[31mrspec ./spec/models/user_spec.rb:66←[0m ←[36m# when password confirmation i
s nil ←[0m
←[31mrspec ./spec/models/user_spec.rb:94←[0m ←[36m# when email format is valid s
hould be valid←[0m
←[31mrspec ./spec/models/user_spec.rb:61←[0m ←[36m# when password doesn't match
confirmation ←[0m
←[31mrspec ./spec/models/user_spec.rb:72←[0m ←[36m# when name is not present ←[0
m
←[31mrspec ./spec/models/user_spec.rb:82←[0m ←[36m# when email format is invalid
 should be invalid←[0m
User.rb文件:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true
end
class用户

有什么建议吗?

错误消息告诉我们@user从未被实例化过

看起来您缺少了
:每个
之前的
之后

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

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

  # ...
  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it { should_not == user_for_invalid_password }
    specify { user_for_invalid_password.should be_false }    
  end

  # ...
end

现在应该创建@user对象&测试变成绿色:)

错误消息告诉我们@user从未被实例化

看起来您缺少了
:每个
之前的
之后

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

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

  # ...
  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it { should_not == user_for_invalid_password }
    specify { user_for_invalid_password.should be_false }    
  end

  # ...
end

@user对象现在应该被创建&测试变为绿色:)

可能是您在
descripe“with invalid password”
之后意外关闭了
descripe user
块,并添加了两个
end
s

目前:

describe User do

  # ...
  describe "with invalid password" do
      let(:user_for_invalid_password) { found_user.authenticate("invalid") }

      it { should_not == user_for_invalid_password }
      specify { user_for_invalid_password.should be_false }
    end
  end
end

# ...

end
应该是:

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

  # ...
  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it { should_not == user_for_invalid_password }
    specify { user_for_invalid_password.should be_false }    
  end

  # ...
end

另外,检查文件末尾的缩进和
end
s的数量。

可能是您在
descripe“with invalid password”
之后意外关闭了
descripe User
块,并添加了两个
end
s

目前:

describe User do

  # ...
  describe "with invalid password" do
      let(:user_for_invalid_password) { found_user.authenticate("invalid") }

      it { should_not == user_for_invalid_password }
      specify { user_for_invalid_password.should be_false }
    end
  end
end

# ...

end
应该是:

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

  # ...
  describe "with invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate("invalid") }

    it { should_not == user_for_invalid_password }
    specify { user_for_invalid_password.should be_false }    
  end

  # ...
end

另外,请检查文件末尾的缩进和
end
s的数量。

谢谢您的回复,但这不起作用。我仍然会犯同样的错误<代码>:每个
都不是教程的一部分,所以我认为这不是这里的问题。谢谢你的回复,但这不起作用。我仍然会犯同样的错误<代码>:每个
都不是教程的一部分,所以我认为这不是这里的问题。我认为Paul是对的,这也是我发现的一个错误。谢谢Paul和@PericlesThedorou。我必须看看Hartls Github,找出我在语法方面遗漏了什么。我认为Paul是对的,这也是我发现的一个错误。谢谢Paul和@Periclesstedorou。我必须看看Hartls Github,找出我在语法方面遗漏了什么。