【发布时间】:2015-05-11 02:10:56
【问题描述】:
如何编写规范以检查用户注册成功后是否在数据库中创建了新记录?在带有 capybara、factorygirl 和 database_cleaner gem 的 Rails 4 中使用 rspec。
我觉得这种情况很常见,应该很容易找到答案,但我无法在这里或通过谷歌找到答案。
【问题讨论】:
-
寻找“期望{}.to change{}”
标签: ruby-on-rails rspec
如何编写规范以检查用户注册成功后是否在数据库中创建了新记录?在带有 capybara、factorygirl 和 database_cleaner gem 的 Rails 4 中使用 rspec。
我觉得这种情况很常见,应该很容易找到答案,但我无法在这里或通过谷歌找到答案。
【问题讨论】:
标签: ruby-on-rails rspec
你可能想要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)
【讨论】:
change 调用......不过,这与原来的问题不同;)跨度>
既然你提到了水豚,所以我假设你想要一个功能规范,当然你需要更改细节以匹配你的应用程序
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)
【讨论】: