如何使用带有Rails 4的rspec来编写规范以检查记录是否保存在数据库中?

jef*_*ale 17 rspec ruby-on-rails

如何编写规范以检查用户注册成功后是否在数据库中创建了新记录?在raails 4中使用rspec与capybara,factorygirl和database_cleaner gems.

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

Tar*_*ast 31

您可能想要更改匹配器

您将执行以下操作:

expect { 
  post :create, :user => {:user => :attributes }
}.to change { User.count }
Run Code Online (Sandbox Code Playgroud)

注意:这个匹配器的问题是这两个地方确实是大括号!

这段代码说:

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

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

before_count = User.count
post :create, :user => {:user => :attributes }
expect(User.count).not_to eq(before_count)
Run Code Online (Sandbox Code Playgroud)


Moh*_*ady 10

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

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
Run Code Online (Sandbox Code Playgroud)


use*_*363 5

当您使用factorygirl时,您可以使用factorygirl来创建测试数据

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

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

要测试你可以写这样的规格

expect{
      post :create, {user: FactoryGirl.attributes_for(:user)}
    }.to change(User, :count).by(1)
Run Code Online (Sandbox Code Playgroud)