2014-02-21 40 views
0

所以我有一個複雜的RPG角色模型,我正在做一個側面項目。對於這個角色扮演遊戲,每個角色都有6種基本的「能力得分」(力量,靈巧,體質,智慧,智慧,魅力)。我特別關注將它們設置爲0的測試,這應該是無效的(角色死亡等)。以下是我在rspec的:爲循環中的特定對象變量賦值

describe "when ability scores are 0" do 
    ability_scores = %w(strength dexterity constitution 
         intelligence wisdom charisma) 
    ability_scores.each do |ability_score| 
    @character.ability_score = 0 
    expect(@character).to be_invalid 
    end 
end 

我有一個工廠在文件創建一個完全有效的字符的開始,並設置subject { @character }

認爲,它將看到ability_score和思考在對角色對象進行評估之前插入其值,但似乎並非如此。

切換出@character.send(:"#{ability_score}=", 0)@character.ability_score = 0導致NoMethodError: undefined method 'strength=' for nil:NilClass

然而,單獨的describe塊很好地工作:

describe "when strength is 0" do 
    before { @character.strength = 0 } 
    it { should_not be_valid } 
end 

但具有這些6是雜亂的混亂。

任何想法?

回答

1

此行有一個問題

character.ability_score = 0 

這條線將調用的character對象上調用:ability_score=方法,但我想你想要的是字符串數組來設置所提到的變量在你正在迭代。

幸運的是,您可以使用send在您的對象上調用任意方法。你可以把你的字符串放到請參閱您的setter方法的符號,然後發送一個消息character

character.send(:"#{ability_score}=", 0) 

(注:你實際上並不需要發送一個符號,你可以把它作爲一個字符串,如果你願意)。 實際上,這正是像調用character.strength = 0

編輯

更改您的describe塊定義測試的內容:在`NoMethodError

​​
+0

結果:未定義的方法「實力='for nil:NilClass',也將對字符的引用改爲實例變量。賦值在一個單獨的描述塊中起作用。我將這兩個添加到我原來的quesiton。 – awochna

+0

你在哪裏初始化'@ character'? –

+0

看起來你的期望恰好發生在describe塊的上下文中,而不是在實際的測試中('it {...}'或'specified {..}')。實例變量在該範圍內不可訪問(請參閱編輯答案)。 –