Ruby on rails 如何编写规范来检查是否使用rspec和Rails 4将记录保存在数据库中?
如何编写规范来检查用户注册成功后是否在数据库中创建了新记录?将Rails 4中的rspec与capybara、factorygirl和database_cleaner gems一起使用 我觉得这种情况很常见,答案应该很容易找到,但我一直无法在这里或通过谷歌找到答案 您可能想要 您将执行以下操作: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 } 注意:这个匹配器
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-这通常是进行两次测试的一个很好的理由,但也有一种方法可以链接多个
更改
调用。。。不过,这与原来的问题不同;)@塔林:你说得对,这不是问题的一部分。我在这里找到了问题和解决办法