0
什麼時候可以用let或let!那麼我怎麼才能引用測試中的變量呢?rspec - 以前的語法是什麼:each and before:all vs let!並讓
let and let的用法如何?與之前使用相比:每個和之前:全部?
什麼時候可以用let或let!那麼我怎麼才能引用測試中的變量呢?rspec - 以前的語法是什麼:each and before:all vs let!並讓
let and let的用法如何?與之前使用相比:每個和之前:全部?
使用before(:each)
和before(:all)
的「經典」的方式是
describe "tests" do
before :each do
@var1='a'
@var2='b'
end
end
然後,通過與測試內部的@
跡象前述他們,即
describe "tests" do
before :each do
@var1='a'
@var2='b'
end
it "does stuff" do
a=some_class.some_method(@var1)
expect(a).to eq @var2
end
end
如果你指的是實例變量希望每個測試中的變量都具有相同的值,您可以使用before :all
。
如果您希望變量具有爲每個測試生成的相同值before :each
。
一般使用before :each
由於使用不當before :all
太容易導致間歇性測試失敗。
將before :all
視爲定義常量。
的let
/let!
格式如下:
describe "tests" do
let(:var1) {'a'}
let!(:var2) {srand(25)}
it "does stuff" do
a=some_class.some_method(var1)
expect(a).to eq var2
end
end
注意幾件事情:
var1
和var2
現在看起來像局部變量的@var1
即var1
而不是在使用時測試和設置。實際上他們是測試類方法。使用時需要注意的重要一點是,您在使用NOT時使用了@
符號,與之前的:each
和before :all
不同,您在哪裏使用過。let
的示例的第一種情況下,let
與var1
一起使用。這允許跨示例的記憶工作。在第二種情況下,let!
與var2
一起使用。這是需要的,因爲您希望在每次使用之前明確調用/設置變量(方法)。 srand()
是一個很好的例子,當你需要這個,因爲它種下隨機數發生器,但僅用於rand()
的下一次使用,所以如果在多個測試示例中使用它,每次都需要重置它。
只需加我兩分錢。我寧願將':each'從我以前的''before'語句中移出。它看起來更乾淨。然後加上':all'就有可能在'before(:all)'塊之前創建。另一個有趣的發現是,你可以模仿'subject'行中的'let'範式,本質上是命名空間嵌套的主題'subject(:call_some_method){some_class.some_method(var1)}',那麼'it'塊就是一行代碼,讀得很好。 –
每次都會對'let'和'let!'進行重新評估,所以每次您的隨機數都會有所不同,而不管您使用哪一個。不同之處在於它們被初始化。 'let!'在所有例子之前初始化 - 即使不使用它的例子。一個例子第一次使用它,「let」被初始化。 – Trejkaz