2012-09-07 18 views
1

我只是從高級/更有經驗的Ruby/Rails開發人員那裏尋找答案,因爲我認爲這是一個更高級的問題。很多不同的模型在測試(rspec)?高級

我有一個寶石,我正在爲AR模型增加一些行爲。我必須測試它是否有許多不同的關聯(has_many,habtm,has_one等),並且我還必須在爲關聯傳遞不同選項(例如:foreign_key)時測試行爲。現在有了所有這些不同的模型,我可以使用數據庫中的同一個表,因爲這些字段本身不需要更改,只有通過has_many,belongs_to等指定的行爲。 請記住,有很多不同的選擇,所以模型的數量是相當大的。

首先,我認爲爲了可讀性的目的,在模型中定義模型旁邊/在測試本身中是不好的做法(如果我有多個使用相同模型的測試,那麼我將它們組合在一起並使用before方法)。所以這是我的目標之一,如果您不同意,您可以對此進行評論。

我不確定的第二件事是我想在所有測試中保留模型的簡單/相同的名稱,例如「Task」,而不是TaskWithManySubtasksAndForeignKey或者那樣的醜陋的東西。問題是有很多模型很難找出有意義和簡單的名字。我不太清楚這一點 - 使用相同的名稱,因爲它是一個常數,有點問題。我有一個代理類的解決方案,但我不認爲這是最佳解決方案。我正在考慮使用變量(與let方法)像「taskModel」,但它似乎有點冗長和不尋常。

想到另一個選項,但我不確定是否可以輕鬆完成,是刪除現有關聯,然後定義一個新關聯。所以例如添加一個has_many,然後刪除它,添加一個habtm ...

你會怎麼做呢?

回答

1

在規格文件中定義獨特的模型不一定是一個壞主意,因爲它可以很容易地看到每個模型是如何定義的。這種方法的明顯問題是,如果您想在其他測試文件中重複使用模型。 Rails的方法是定義all the models in separate files,然後在需要它的測試中只需要它們。

我認爲這隻取決於您有多少模型以及您想要重複使用多少。在我的一個寶石中,我採用了defining the models in the spec file的方法,在另一個寶石中,我將它們定義在spec helper中,而在另一個寶石中,我採用了Rails方法,併爲它們使用了separate directory。如果你問我哪一個是我喜歡的,那麼我可能會選擇同樣包含模型的規格,因爲它們都在同一個地方。但絕對是一個主觀問題。

另一種方法我已經採取有時是打造了保證匿名類只圍繞該測試的壽命:

describe 'my test' do 
    let(:my_class) do 
    Class.new(Task) do 
     has_many :things 
     belongs_to :something_else 
    end 
    end 

    it 'should have many things' do 
    my_class.should have(100).things 
    end 
end 
+0

感謝您的意見,要接受這個:) – mrbrdo

相關問題