0

私の質問で明らかなように、私はRailsを学んでいます(私は主にJava開発者です)、rspecテストからモデルのメソッドにアクセスするのに問題があります。私は基本的にこのチュートリアルに従っていますが、それを自分のプロジェクトに適用しています。私は、学生の学年と現在の時期に基づいて、卒業年をメソッドとして定義しようとしています。オブジェクトをインスタンス化し、Rails コンソールでメソッドを呼び出すと、期待どおりに動作しますが、テストで実行しようとすると、次のようになります。

undefined method `graduation_year'

学生.rb

class Student < ActiveRecord::Base
  validates :school_id, presence: true, uniqueness: true
  validates :first_name, presence: true, length: { maximum: 30 }
  validates :last_name, presence: true, length: { maximum: 40 }
  validates :gender, presence: true, inclusion: { :in => %w(m f M F) }
  validates :grade, presence: true, numericality: { greater_than_or_equal_to: 1 , less_than_or_equal_to: 12 }

  def graduation_year
    year = Date.today.year + ( 12 - grade )
  end
end

Student_spec.rb

require 'spec_helper'

describe Student do
  before { @student = Student.new(
                        school_id: 3, 
                        first_name: "Michael", 
                        last_name: "Green", 
                        gender: "M", 
                        grade: 6)}

  subject { @student }

  it { should respond_to(:school_id) }
  it { should respond_to(:first_name) }
  it { should respond_to(:last_name) }
  it { should respond_to(:gender) }
  it { should respond_to(:grade) }
  it { should respond_to(:graduation_year) }

  it { should be_valid }

  describe "when school_id is not present" do
    before { @student.school_id = " " }
    it { should_not be_valid }
  end
  .
  .
  .  
  describe "when grade is 7 graduation_year should be calculated correctly" do
    before { @student.grade = 7 }
    expect(@student.graduation_year).to eq(Date.today.year+5)
  end
end

エラーメッセージ

~/dev/rails_apps/spec/models/student_spec.rb:96:in `block (2 levels) in <top (required)>': undefined method `graduation_year' for nil:NilClass (NoMethodError)
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:242:in `module_eval'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:242:in `subclass'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:228:in `describe'
from ~/dev/rails_apps/spec/models/student_spec.rb:94:in `block in <top (required)>'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:242:in `module_eval'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:242:in `subclass'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/example_group.rb:228:in `describe'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/dsl.rb:18:in `describe'
from ~/dev/rails_apps/spec/models/student_spec.rb:3:in `<top (required)>'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `load'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `block in load_spec_files'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `each'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/configuration.rb:819:in `load_spec_files'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/command_line.rb:22:in `run'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/runner.rb:80:in `run'
from ~/dev/.rvm/gems/ruby-2.0.0-p247/gems/rspec-core-2.13.1/lib/rspec/core/runner.rb:17:in `block in autorun'

また、これは問題ではないと思いますが、もともとgraduation_yearStudent テーブルの属性として を持っていましたが、それを削除しました。このテストは、それが正しく計算されていることを確認することになっています。

テストでも試してみputs first_nameましたが、同じ未定義のメソッドエラーが発生しますが、first_name. Ruby/Rails の仕組みについて何かが欠けているだけだと思います。

4

2 に答える 2