【问题标题】:How to check if a record is saved in the database using rspec with Rails 4?如何使用带有 Rails 4 的 rspec 检查记录是否保存在数据库中?
【发布时间】:2015-05-11 02:10:56
【问题描述】:

如何编写规范以检查用户注册成功后是否在数据库中创建了新记录?在带有 capybara、factorygirl 和 database_cleaner gem 的 Rails 4 中使用 rspec。

我觉得这种情况很常见,应该很容易找到答案,但我无法在这里或通过谷歌找到答案。

【问题讨论】:

  • 寻找“期望{}.to change{}”

标签: ruby-on-rails rspec


【解决方案1】:

你可能想要change matcher

你会做这样的事情:

expect { 
  post :create, :user => {:user => :attributes }
}.to change { User.count }

expect { 
  post :create, :user => {:user => :attributes }
}.to change(User, :count)

这段代码说:

期望运行第一个代码块来改变我在运行那个代码块时得到的值

并且在功能上等同于写作:

before_count = User.count
post :create, :user => {:user => :attributes }
expect(User.count).not_to eq(before_count)

【讨论】:

  • 虽然我同意,但您的规范实际上看起来像什么(如果它是功能规范)可能更像其他人所说的 - 期望点击注册按钮。我的示例更像是一个控制器规范,但可以让您大致了解更改匹配器的工作原理;)
  • 这无助于检查当前对象是否已成功更新。如果对象在更改之前已存在于数据库中,则不会更改计数。
  • 但是如果我需要创建很少的记录怎么办?喜欢同时创建用户、地址和项目?
  • @PiotrGalas - 这通常是进行两次测试的好理由,但也有一种方法可以链接多个 change 调用......不过,这与原来的问题不同;)跨度>
  • @TarynEast 你是对的,它不是这个问题的一部分。我在这里找到了问题和解决方案stackoverflow.com/questions/13616631/…
【解决方案2】:

既然你提到了水豚,所以我假设你想要一个功能规范,当然你需要更改细节以匹配你的应用程序

require 'rails_helper'
feature 'Users' do # or whatever
  scenario 'creating an account' do
    visit root_path
    click_link 'Sign Up'
    fill_in 'Name', with: 'User 1'
    fill_in 'Email', with: 'email@domain.com'
    fill_in 'Password', with: 'password'
    expect{
      click_button 'Sign up'
    }.to change(User, :count).by(1)
  end
end

【讨论】:

    【解决方案3】:

    在使用 factorygirl 时,可以使用 factorygirl 创建测试数据

    FactoryGirl.define do
     factory :user do
      sequence(:name) { |n| "user #{n}" }
      sequence(:email) { |n| "sampleuser+#{n}@sampleuser.com" }
      password '123456789'
    end end
    

    您可以在需要用户记录时使用“FactoryGirl.create(:user)”。

    为了测试你可以这样写规范

    expect{
          post :create, {user: FactoryGirl.attributes_for(:user)}
        }.to change(User, :count).by(1)
    

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2015-05-10
      • 1970-01-01
      • 2019-01-25
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多