标签: rspec-rails

如何在Rails 3.0中替换Rspec的ENV ["RAILS_ENV"] || ='test'?

我正在使用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问题或其他任何地方找到这一点.

rspec2 rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
4227
查看次数

RSpec 1.3.3 Rails 2.3.9 Webrat 0.7.3"未定义方法`assign`"

我的规格

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)

ruby rspec ruby-on-rails rspec-rails

4
推荐指数
1
解决办法
1758
查看次数

我的存根上的rspec put请求的正确参数是什么

我有一个控制器规格,我得到了以下失败的期望:

 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)

ruby-on-rails rspec2 rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
7202
查看次数

如何调试rake规范不执行测试; 无限悬挂问题(导轨3)

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

rake rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
2779
查看次数

普通项目上的RSpec MustBeConfiguredBeforeExampleGroupsError

我正在设置一个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)

ruby-on-rails rspec2 rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
1345
查看次数

RSpec:使用调用update_attributes的方法测试模型

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)

rspec2 rspec-rails ruby-on-rails-3.1

4
推荐指数
1
解决办法
4521
查看次数

宝石测试使用url_for无法找到路线

我认为我的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.

gem routes rspec2 rspec-rails ruby-on-rails-3

4
推荐指数
1
解决办法
2979
查看次数

如何使用RSpec测试记忆?

我的其中一个课程中有下一个代码:

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)

基本行为:

  1. 它会在第一次通话时创建新记录.
  2. 它随后的调用返回相同的结果.
  3. 它会在每次更新后重置ivar,并在后续调用中返回与当前环境关联的第一个(也是唯一的)记录.

对于这种方法,我有下一个测试:

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?

更新:

最后,我的方法如下: …

ruby ruby-on-rails memoization rspec2 rspec-rails

4
推荐指数
1
解决办法
1520
查看次数

创建记录似乎不会持久存储到测试数据库rspec,factory_girl_rails

根据factory_girl_rails文档:这是factory_girl build()create()方法之间的区别:

#返回未保存的用户实例

user = build(:user)

#返回已保存的用户实例

user = create(:user)

我知道工厂的强大之处在于它们使您的测试套件变得快速,因为它允许您运行测试而无需通过该build()方法触摸数据库.create()另一方面,该方法仍然触摸数据库,因为它将记录持久存储到数据库中.

我很困惑,因为我在使用后在测试中设置了一个断点 create()

  • rails控制台说该对象持久存储到数据库(如预期的那样)
  • 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()记录时会被持久化到数据库中.它实际上根本没有保存到数据库中吗?

ruby rspec ruby-on-rails rspec-rails factory-bot

4
推荐指数
1
解决办法
2114
查看次数

Rspec post:创建'未知关键字:'

我是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)失败了?
  • 我如何将模拟对象发送到控制器?
  • 为什么期望版本有效?

任何对问题的见解都将非常感激.我一直在试图解决这个问题,我的猜测是,这是一个明显的答案.

unit-testing rspec ruby-on-rails rspec-rails rspec3

4
推荐指数
1
解决办法
1546
查看次数