2012-06-24 28 views
0

如果我的問題很愚蠢,我很抱歉,因爲我只是想問一下Ruby中的以下行含義。 (我儘可能快地閱讀一本關於Rails的爲我的過程中,所以我沒有對Ruby語言的牢牢把握。)「test do」語法的含義

這裏是單元測試目的的一段代碼:

class ProductTest < ActiveSupport::TestCase 
    test "product attributes must not be empty" do // this line I don't know 
    product = Product.new 
    assert product.invalid? 
    assert product.errors[:title].any? 
    assert product.errors[:description].any? 
    assert product.errors[:price].any? 
    assert product.errors[:image_url].any? 
    end 

我想問的是:在這條線我不知道,語法test "...." do,這是什麼意思?它是一個函數,方法,類還有其他的東西嗎?

+2

你應該學會紅寶石*。如果你不理解該框架所建立的語言,那麼你將永遠無法充分利用該框架。並且不要急於學習過程! –

+0

非常抱歉。我只是有一個關於Ruby的快速教程,當我更改爲真正的大型Ruby環境(Rails)時,它讓我感到恐慌:(大問題是我沒有多少次即將到來的課程 – hqt

回答

2

這東西被稱爲類的宏,奇特的名字爲一種簡單的機制:

這是一個類的方法(DEF self.test),這樣你可以在你的類定義直接使用它,例如。

正常的方式來編寫測試用例(在測試::單位)會比較喜歡這樣的:

def test_something_interesting 
    ... 
end 

然而,的ActiveSupport(Rails的部分)爲您提供這種語法糖,這樣就可以把它寫像這樣:

test "something interesting" do 
    ... 
end 

該方法將定義一個名爲test_something_interesting的方法。

你可以在Rails的實現:*你學習Rails的前

activesupport/lib/active_support/testing/declarative.rb 
+0

你能告訴我如何創建類似的東西?謝謝:) – hqt

+0

@hqt - 它被稱爲Ruby DSL(域特定語言)。基本上,這意味着您正在編寫將使用一些新構造擴展原始語言的代碼。要了解它的最佳方式是[google it](http://www.google.com/search?q=ruby+dsl)。 – Casper

3

這是一個塊。某處在測試框架這種方法定義:

def test(description, &block) 
    # do something with block 
end 

高度建議你選擇一個很好的Ruby的書,你讀它慢慢

+0

你能告訴我一個這個函數應該是:'def test(description)'。爲什麼你把'&block'放到這個函數中(儘管如果我記得的話,這意味着block是可選的)。? – hqt

+0

是的,一個塊是'do end'語法,也可以是'{}'。你可以在這裏閱讀更多關於塊:http://rubylearning.com/satishtalim/ruby_blocks.html –