【问题标题】:Test failing with RSpec in my rails app在我的 Rails 应用程序中使用 RSpec 测试失败
【发布时间】:2013-01-20 18:28:52
【问题描述】:

我正在尝试运行此测试,但由于某种原因它失败了。

describe "User Pages" do
    subject { page }
    .
    .
describe "Sign up" do
    before { visit signup_path }

    let(:submit) { "Sign Me Up" }
    .
    .
 describe "with valid information" do
  before do
    fill_in "name",             with: "newuser"
    fill_in "Username",         with: "user254"
    fill_in "Email",            with: "user@yahoo.com"
    select  "Male",             from: "gender"        
    fill_in "Password",         with: "password"
    fill_in "Confirm Password", with: "password"
  end

  it "Should create a user" do
    expect { click_button submit}.to change(User, :count).by(1)
  end   
end

但是,当我运行测试时,我得到了这个错误

Failures:

  1) User Pages signup with valid information Should create a user
      Failure/Error: expect { click_button submit}.to change(User, :count).by(1)
       count should have been changed by 1, but was changed by 0
      # ./spec/requests/user_pages_spec.rb:35:in `block (4 levels) in <top (required)>'

      Finished in 4.61 seconds
      35 examples, 1 failure

      Failed examples:

      rspec ./spec/requests/user_pages_spec.rb:34 # User Pages signup with valid information Should create a user

这是我在控制器中的创建操作

def create
   @user = User.new(params[:user])
   if @user.save
     redirect_to @user
   else
     render 'new'
   end
end

当我尝试在浏览器中注册时,注册成功。我的测试有什么问题吗?谢谢

【问题讨论】:

  • 您是否尝试过在@user 对象上输出任何错误?这可能会为您提供一些额外的见解。

标签: ruby-on-rails rspec tdd


【解决方案1】:

检查用户是否保存在控制器上:

def create
   @user = User.new(params[:user])
   puts "valid? = #{@user.valid?.inspect}"
   if @user.save
     puts 'saved!'
     redirect_to @user
   else
     puts 'not saved'
     puts @user.errors.inspect
     render 'new'
    end
end

这将打印控制器进程,您将知道发生了什么

如果什么都没有打印,那么问题是一些 before_filter 阻止了创建操作被调用

【讨论】:

  • 这是打印出来的#&lt;ActiveModel::Errors:0x007f8ff059f718 @base=#&lt;User id: nil, name: "", email: "", created_at: nil, updated_at: nil, password_digest: nil, username: "", gender: "", remember_token: nil&gt;, @messages={:password_digest=&gt;["can't be blank"], :name=&gt;["can't be blank"], :email=&gt;["can't be blank", "is invalid"], :username=&gt;["can't be blank"], :gender=&gt;["can't be blank"],:password=&gt;["is too short (minimum is 6 characters)"], :password_confirmation=&gt;["can't be blank"]}&gt;
  • 检查您填写的表单名称是否正确,我想表单文件类似于“user[name]”或“user_name”,而不仅仅是“name”,如果您使用form_for helper,这就是为什么记录中的所有内容都为空,params[:user] 为空,您没有以正确的方式填写表单,请使用浏览器检查表单以查看表单字段的名称/ID
  • 非常感谢!像魅力一样工作。
【解决方案2】:

尝试一下

it "Should create a user" do
    click_button submit
    User.count.should == 1
  end  

【讨论】:

  • 我仍然收到错误Failure/Error: User.count.should == 1 expected: 1 got: 0 (using ==)
  • 然后尝试使用@user.save!在你的控制器中,那么你应该得到一个错误,为什么它不工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多