3

그래서 을 가질 수있는 Game 클래스가 있고 각 Version은 많은 GameStats을 가질 수 있습니다. 나는 각각 Versionbelongs_to, Game, 그리고 각각 GameStatbelongs_toa, Versionhas_oneGame부터 Versions까지 가지고있다. 내 테스트에서 gameversion 개체에 대한 응답을 테스트 할 때 개체 평등에 대해 이러한 테스트는 통과하지만 @stats.game을 호출하여 개체를 참조하려고하면 #<NoMethodError: undefined method 'game' for nil:NilClass>이 표시됩니다. 나는 여기 레일 콘솔에서 @stats.game을 수행 할 수 있기 때문에 매우 혼란 스럽지만 테스트에는 존재하지 않습니다.Rspec 테스트에서 nil 클래스에 대해 정의되지 않은 메서드

class Game < ActiveRecord::Base 
    has_many :versions, dependent: :destroy 
    has_many :platforms, through: :versions 
    has_many :game_stats, class_name: 'GameStats', through: :versions 

    validates :name, presence: true 
end 

class GameStats < ActiveRecord::Base 
    belongs_to :version 

    has_one :game, through: :version 

    validates :version_id, presence: true 
end 

class Version < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :platform 

    has_many :game_stats, class_name: 'GameStats' 

    validates :game_id, presence: true 
    validates :platform_id, presence: true 
end 

그리고 내 RSpec에 파일 (관련 부분은)과 같이이다 :

관련 모델 코드

는 여기

describe GameStats do 
    let!(:game) { FactoryGirl.create(:game) } 
    let!(:platform) { FactoryGirl.create(:platform) } 
    let!(:version) { FactoryGirl.create(:version, game: game, platform: platform) } 

    before do 
    @stats = FactoryGirl.create(:game_stats, version: version) 
    end 

    subject { @stats } 

    .... 

    it { should respond_to(:version) } 
    it { should respond_to(:game) } 

    its(:version) { should eq version } 
    its(:game) { should eq game } 

    ... 

    describe "2 different days stats should have the same game" do 
    before do 
     @stats.save 
     @another_stats = FactoryGirl.create(:game_daily_stats, version: version, datestamp: Date.yesterday) 
     @another_stats.save 
    end 
    expect(@another_stats.game).to eq @stats.game 
    end 
end 

사람이 오류가 발생하는 이유 어떤 생각을 가지고 있습니까?

저는 RSpec-rails 2.14.0, factory_girl_rails 4.2.1을 사용하여 Rails 4.0.0, Ruby 2.0.0-p247을 사용 중입니다.

답변

4

교체 :

expect(@another_stats.game).to eq @stats.game 

로 :

it 'description' do 
    expect(@another_stats.game).to eq @stats.game 
end 

은 BTW,

+0

감사합니다 인스턴스 변수 대신 let를 사용합니다. 그게 효과가 있었고, 나는 그것을 놓쳤다는 것을 믿을 수 없다. 그건 내게 부주의했다. –

+0

모든 rspec 사용자가이 작업을 매일 수행합니다.) – apneadiving

관련 문제