2014-04-27 21 views
-1

我有使用RSpec沒有太多經驗,我不會傳播關於一個真實的任務,但如果是我遇到的問題將大大簡化,它看起來像這樣:RSpec的:如何剿變量的緩存

describe "Test" do 
     context "ctx_1" do 
     before(:all) do 
      # Changes of $x from "nil" to a some NOT an earlier predefined instance. 
      # A real case supposes getting this variable from other execution part. 
      # It is very essential. 
      $x = [1, 2, 3] 
     end 

     $x.each do |e| 
      context "ctx_2" 
      before (:all) do 
       puts "do a some things for #{e}" 
      end 

      it "example #{$x.index(e)}" do 
       puts "do some checking for #{e}" 
      end 
      end 
     end 
     end 
    end 

有沒有辦法將「ctx 2」換成新的$ x值而沒有兌現值(零)的循環? 問題是$ x的更新值僅在「it」塊內有效。與其他entytyes任何變化(@而不是$,描述,上下文等之前)未通過..

+0

不太清楚你正在嘗試做的,但你不應該使用全局變量設置爲$x配置的一部分。 – Stefan

+0

heve你用'let'試過了嗎? – pawel7318

+0

是的,我已經讓,讓!而不是之前,但也有同樣的結果。 – Eugene

回答

0

您有關於如何以及何時你的代碼運行的一些困惑:

  • before塊在測試運行之前運行

  • 測試聲明中的context塊運行階段 - 很多更早的時候,你指定$x比早得多。

這就是爲什麼當你做$x.each你「零」作爲$x值。該$x.each循環將永遠運行before塊之後,所以你需要重新設計你的代碼。

你也許可以在spec_helper.rb

+0

如果我理解,重新設計你建議,假設拒絕將「context {it {}}」塊封裝到$ x.each循環中。但這是我腳本的關鍵時刻。換句話說,我必須在運行測試開始時獲得一些x-collection,然後在測試的另一部分稍後對此集合執行一些步驟(操作,檢查等)。不幸的是,迄今爲止似乎不可能。 – Eugene

+0

您可以從一個單一的測試中(測試在遍歷'$ x')執行的,而不是建立單獨的測試每個 –

+0

邏輯我affraid這是不可能的,因爲我不知道$ x.count,測試前將會運行。 – Eugene