我正在使用rails (3.0.4)和rspec-rails (2.5.0). When I runrails生成rspec:install
it producesspec_helper.rb`包含这一行:
ENV["RAILS_ENV"] ||= 'test'
Run Code Online (Sandbox Code Playgroud)
当我跑步时,rake spec我在终端上收到此警告:
DEPRECATION WARNING: RAILS_ENV is deprecated. Please use ::Rails.env.
Run Code Online (Sandbox Code Playgroud)
这并不令人讨厌,因为只在我的内部运行一次Spork.prefork,但如果可能的话,我想过去弃用.我是Rails的新手,并没有在rspec-rails问题或其他任何地方找到这一点.
我的规格
require 'spec_helper'
describe 'user_sessions/new.html.erb' do
let (:user_session) { mock_model(UserSession).as_null_object }
before do
assign(:user_session, user_session)
end
it 'should have the sign in header' do
render
rendered.should contain('Sign in')
end
end
Run Code Online (Sandbox Code Playgroud)
抛出
1)
NoMethodError in 'user_sessions/new.html.erb should have the sign in header'
undefined method `assign' for #<Spec::Rails::Example::ViewExampleGroup::Subclass_1:0x1036835e0>
Run Code Online (Sandbox Code Playgroud)
宝石:
group :test, :cucumber do
gem "cucumber-rails", "0.3.2"
gem "rspec-rails", "1.3.3"
gem "database_cleaner", "0.5.0"
# gem "capybara", "0.3.9"
gem "webrat"
gem "selenium-client", "1.2.18"
gem "sqlite3-ruby", "1.3.1"
gem "email_spec", "~> 0.6.3", :require => 'spec'
gem …Run Code Online (Sandbox Code Playgroud) 我有一个控制器规格,我得到了以下失败的期望:
Failure/Error: put :update, :id => login_user.id, :user => valid_attributes
#<User:0xbd030bc> received :update_attributes with unexpected arguments
expected: ({:name=>"changed name", :email=>"changed@mail.com", :password=>"secret", :password_confirmation=>"secret"})
got: ({"name"=>"Test user", "email"=>"user@test.com", "password"=>"secret", "password_confirmation"=>"secret"})
Run Code Online (Sandbox Code Playgroud)
对我来说,看起来我正在传递"name" => "Test User",我期待着:name => "test user"
我的规格看起来像这样:
describe 'with valid parameters' do
it 'updates the user' do
login_user = User.create!(valid_attributes)
controller.stub(:current_user).and_return(login_user)
User.any_instance.
should_receive(:update_attributes).
with(valid_attributes.merge(:email => "changed@mail.com",:name=>"changed name"))
put :update, :id => login_user.id, :user => valid_attributes
end
end
Run Code Online (Sandbox Code Playgroud)
我的有效属性有这样的东西:
def valid_attributes
{
:name => "Test user",
:email=> "user@test.com",
:password …Run Code Online (Sandbox Code Playgroud) 使用rake 0.9.2,rspec,期望,模拟2.6.0,rspec-core 2.6.4,rspec-rails 2.6.1
当我执行rake rails或rspec spec path/to/spec时,我得到正常输出,直到我希望看到测试实际执行,然后没有进一步.我必须杀死进程kill-9%1来终止任务.
我的gemfile:
source 'http://rubygems.org'
gem 'rails', '3.0.4'
gem 'rake', '0.9.2'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
# gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'warden'
gem 'devise', "= 1.2.1"
gem 'devise_invitable'
gem 'mysql'
gem 'will_paginate', "~> 3.0.pre2"
gem 'acts-as-taggable-on'
gem 'acts_as_list'
gem 'activemerchant'
gem 'braintree'
gem 'bartt-ssl_requirement', :require => 'ssl_requirement'
gem "paperclip"
gem 'jeditable-rails'
gem 'rdiscount'
gem "nifty-generators", :group => :development
gem "exception_notification", :git => "git://github.com/rails/exception_notification", :require => 'exception_notifier' …Run Code Online (Sandbox Code Playgroud) 我正在设置一个Rails 3.1项目,并希望使用RSpec正确测试它.
运行rails g rspec:install并进一步运行后rspec,控制台消息如下所示:
% rspec
/Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:470:in `assert_no_example_groups_defined': RSpec's mock_framework configuration option must be configured before any example groups are defined, but you have already defined a group. (RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError)
from /Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:168:in `mock_framework='
from /Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:142:in `mock_with'
from /Users/ened/project/spec/controllers/../spec_helper.rb:19
from /Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core.rb:71:in `configure'
from /Users/ened/project/spec/controllers/../spec_helper.rb:11
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in `require'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:225:in `load_dependency'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in `require'
from /Users/ened/project/spec/controllers/submissions_controller_spec.rb:1
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:234:in `load'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:234:in `load'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:225:in `load_dependency'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:234:in `load'
from /Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `load_spec_files'
from /Library/Ruby/Gems/1.8/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `map'
from …Run Code Online (Sandbox Code Playgroud) RSpec新手在这里.
我正在尝试测试我的模型,这些模型具有update_attributes用于更新其他模型的值的方法.
我确信这些值在数据库中持久存在,但它们没有传递规范.
但是,当我包含类似@user.reload它的东西时.
我想知道我是不是做错了.具体来说,如何测试改变其他模型属性的模型?
更新代码:
describe Practice do
before(:each) do
@user = build(:user)
@user.stub!(:after_create)
@user.save!
company = create(:acme)
course = build(:acme_company, :company => company)
course.save!
@practice = create(:practice, :user_id => @user.id, :topic => "Factors and Multiples" )
end
describe "#marking_completed" do
it "should calculate the points once the hard practice is done" do
@practice.question_id = Question.find(:first, conditions: { diff: "2" }).id.to_s
@practice.responses << Response.create!(:question_id => @practice.question_id, :marked_results => [true,true,true,true])
@practice.save!
lambda {
@practice.marking_completed
@practice.reload # …Run Code Online (Sandbox Code Playgroud) 我认为我的gem测试要运行的虚拟应用程序没有正确设置,因为当我url_for在gem的助手中调用Gadget实例(虚拟应用程序中的存根模型)时,我得到了
undefined method `gadgets_path' for #<#<Class:0x007fe274bc1228>:0x007fe273d45eb0>
Run Code Online (Sandbox Code Playgroud)
背景:我分叉了一个宝石并做了一些重大改变.(这是分支.)现在我正在尝试使rspec测试工作,以便我可以验证我的更新.
测试设置类似于Rails引擎,在spec目录中有一个虚拟应用程序.该应用程序有一个model(Gadget),其中包含适当的控制器和spec/dummy/environment/routes.rb文件中声明的资源:
Dummy::Application.routes.draw do
resources :gadgets
end
Run Code Online (Sandbox Code Playgroud)
该spec/spec_helper.rb文件如下所示:
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../dummy/config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
RSpec.configure do |config|
config.mock_framework = :rspec
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.order = "random"
config.include Rails.application.routes.url_helpers
end
Run Code Online (Sandbox Code Playgroud)
(你实际上可以在项目的github repo中看到完整的测试设置.我实际上已经在一周左右开启了这个问题,但现在我才开始试图解决它.)
一个未挂起的测试创建一个Gadget实例,然后将该调用作为参数调用.当帮助程序尝试时url_for(@gadget),它会触发上述错误.
这有什么不对?
ETA Dec 04:更新了当前版本spec_helper.rb.
我的其中一个课程中有下一个代码:
class Settings < ActiveRecord::Base
def self.current
@settings ||= Settings.where({ environment: Rails.env }).first_or_create!
end
# Other methods
end
Run Code Online (Sandbox Code Playgroud)
基本行为:
对于这种方法,我有下一个测试:
describe Settings do
describe ".current" do
it "gets all settings for current environment" do
expect(Settings.current).to eq(Settings.where({ environment: 'test' }).first)
end
end
end
Run Code Online (Sandbox Code Playgroud)
我对此感到不舒服,因为我实际上并没有测试memoization,所以我一直在关注这个问题的方法,我尝试过类似的东西:
describe ".current" do
it "gets all settings for current environment" do
expect(Settings).to receive(:where).with({ environment: 'test' }).once
2.times { Settings.current }
end
end
Run Code Online (Sandbox Code Playgroud)
但是此测试返回以下错误:
NoMethodError:
undefined method `first_or_create!' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何使用RSpec测试此方法的memoization?
更新:
最后,我的方法如下: …
根据factory_girl_rails文档:这是factory_girl build()和create()方法之间的区别:
#返回未保存的用户实例
user = build(:user)
#返回已保存的用户实例
user = create(:user)
我知道工厂的强大之处在于它们使您的测试套件变得快速,因为它允许您运行测试而无需通过该build()方法触摸数据库.create()另一方面,该方法仍然触摸数据库,因为它将记录持久存储到数据库中.
我很困惑,因为我在使用后在测试中设置了一个断点 create()
test/test.log该对象被保存到数据库显示(预期)但是,当我看测试数据库中的表:它不存在(不期望我希望看到在数据库中的对象)
#someApp/spec/models/user_spec.rb
RSpec.describe User, type: :model do
it "checks the age on the basic 'User' Factory " do
user = create(:user) # should create a user and persist it to the database
binding.pry
expect(user.age).to eq(28)
end
end
Run Code Online (Sandbox Code Playgroud)执行在断点处停止,并且rails控制台打开.我测试持久性,它返回true:
user.persisted?
=> true
Run Code Online (Sandbox Code Playgroud)
但是,我查看表中的测试数据库,刷新表,但仍然没有显示记录:
我错过了什么?我以为当你使用create()记录时会被持久化到数据库中.它实际上根本没有保存到数据库中吗?
我是Rspec的新手,我正在尝试测试我的控制器方法的基本功能.我知道我不应该测试基本功能,但我更多的是为了学习而不是为了构建一些东西.
我有一个名为ProtocolsController的控制器.控制器用于基本CRUD功能.我正在尝试测试控制器#create方法.下面是我的#create控制器:
def create
@protocol = Protocol.new(protocol_params)
if @protocol.save
flash[:notice] = 'New protocol added'
redirect_back(fallback_location: 'test_results#index')
else
flash[:notice] = @protocol.errors[:name]
render 'new'
end
end
Run Code Online (Sandbox Code Playgroud)
为了测试悲伤路径,我想向控制器传递一个模拟对象,该对象包含用于创建Protocol类实例的必要参数.为此,我有以下代码:
describe '#create' do
it 'fails to save because the name already exists' do
params = FactoryGirl.attributes_for(:protocol)
post :create, :protocol => params
end
end
Run Code Online (Sandbox Code Playgroud)
现在我知道测试是不完整的,但我一次测试一行,当我运行Rspec时,我收到以下错误:
Failure/Error: post :create, :protocol => params
ArgumentError:
unknown keyword: protocol
Run Code Online (Sandbox Code Playgroud)
但是当我将帖子更改为: expect { post :create, :protocol => params }
有用.这让我想到了我的问题:
post :create, :protocol => params)失败了?任何对问题的见解都将非常感激.我一直在试图解决这个问题,我的猜测是,这是一个明显的答案.
rspec-rails ×10
rspec2 ×6
rspec ×3
ruby ×3
factory-bot ×1
gem ×1
memoization ×1
rake ×1
routes ×1
rspec3 ×1
unit-testing ×1