首页 文章

RSpec未定义方法“errors_on”

提问于
浏览
6

我有以下模型,我想用RSpec测试:

class Language < ActiveRecord::Base
  has_and_belongs_to_many :dvds
  validates :title, presence: true, uniqueness: { case_sensitive: false }
end

language_spec.rb

describe Language do
  describe 'title validation' do
    context 'title is present' do
      before(:each) do
        @lang = Language.new(title: 'English')
      end

      it 'is valid with present title' do
        expect(@lang).to have_exactly(0).errors_on(:title)
      end
    end

    context 'title is not present' do
      before(:each) do
        @lang = Language.create
      end

      it 'has an error on title attribute' do
        expect(@lang).to have_exactly(1).errors_on(:title)
      end

    end
  end
end

不幸的是我遇到了测试失败:

失败:1)语言 Headers 验证 Headers 存在对当前 Headers 有效失败/错误:期望(@lang).to have_exactly(0).errors_on(:title)NoMethodError:未定义方法errors_on'for#<语言:0xaa40e98> ' . )中的# . / spec / mode /language_spec.rb:9:inblock(4个等级)语言 Headers 验证 Headers 不存在 Headers 属性出现错误失败/错误:期望(@lang).to have_exactly(1) .errors_on(:title)NoMethodError:未定义方法errors_on'for#<语言ID:nil,title:nil,created_at:nil,updated_at:nil># . / spec / model / language_spec.rb:19:inblock(4 levels)在''

的Gemfile

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer',  platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0',          group: :doc

# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring',        group: :development

# Pagination plugin
gem 'will_paginate', '~> 3.0'

# Testing
group :development, :test do
  gem "rspec-rails", "~> 3.0.1"
  gem "factory_girl_rails", "~> 4.4.1"
end

group :test do
  gem "faker", "~> 1.3.0"
  gem "capybara", "~> 2.3.0"
  gem "database_cleaner", "~> 1.3.0"
  gem "launchy", "~> 2.4.2"
  gem "selenium-webdriver", "~> 2.42.0"
end

任何想法为什么我得到 undefined method "errors_on"

2 回答

  • 4

    errors_on 匹配器移动到the rspec-collection_matchers gem,因此将其添加到您的Gemfile将修复错误 .

    如果你想摆脱非核心语法,你可以做到

    describe Language do
      describe 'title validation' do
        context 'title is present' do
          before(:each) do
            @lang = Language.new(title: 'English')
          end
    
          it 'is valid with present title' do
            expect(@lang.errors[:title]).to be_empty
          end
        end
    
        context 'title is not present' do
          before(:each) do
            @lang = Language.create
          end
    
          it 'has an error on title attribute' do
            expect(@lang.errors.added?(:title, :blank)).to be_true
          end
        end
    
      end
    end
    

    have_exactly and related matchers have also moved to rspec-collection_matchers.

  • -1

    尝试设置类型选项:

    describe Language, type: :model do
    

    或者使用 infer_spec_type_from_file_location! (见here

    RSpec.configure do |config|
      config.infer_spec_type_from_file_location!
    end
    

相关问题