Ruby on rails 如何编写规范来检查是否使用rspec和Rails 4将记录保存在数据库中?

Ruby on rails 如何编写规范来检查是否使用rspec和Rails 4将记录保存在数据库中?,ruby-on-rails,rspec,Ruby On Rails,Rspec,如何编写规范来检查用户注册成功后是否在数据库中创建了新记录?将Rails 4中的rspec与capybara、factorygirl和database_cleaner gems一起使用 我觉得这种情况很常见,答案应该很容易找到,但我一直无法在这里或通过谷歌找到答案 您可能想要 您将执行以下操作: expect { post :create, :user => {:user => :attributes } }.to change { User.count } 注意:这个匹配器

如何编写规范来检查用户注册成功后是否在数据库中创建了新记录?将Rails 4中的rspec与capybara、factorygirl和database_cleaner gems一起使用

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

您可能想要

您将执行以下操作:

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)

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

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

在使用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)

寻找“expect{}.tochange{}”,虽然我同意,但是你的规范实际上是什么样子(如果它是一个功能规范的话)可能会更像其他人所说的——在注册按钮上点击expect。我的示例更像一个控制器规范,但让您概括了解了变更匹配器的工作原理;)这无助于检查当前对象是否已成功更新。如果对象在更改之前存在于数据库中,它不会更改计数。但是如果我需要创建一些记录,该怎么办?就像同时创建用户、地址和项目一样?@PiotrGalas-这通常是进行两次测试的一个很好的理由,但也有一种方法可以链接多个
更改
调用。。。不过,这与原来的问题不同;)@塔林:你说得对,这不是问题的一部分。我在这里找到了问题和解决办法