2015-04-14 48 views
0

我的Rails測試出現問題。 我有一個模型新聞和型號標記,其中有一個HABTM關係 新聞型號:測試方法始終保密

class News < ActiveRecord::Base 
    has_and_belongs_to_many :tags 

    validates :name, presence: true, length: { minimum: 4 } 
    validate :has_tags? 

    private 

    # Validates presence of tags 
    def has_tags? 
     errors.add(:tags, ": News must have some tags.") if self.tags.blank? 
    end 

測試模型:

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :news 

    validates :name, presence: true 

我寫的has_tags驗證測試:

test "should be valid" do 
    assert @news.valid? 
    end 

    test "news should have tags" do 
    assert_not @news.tags.blank? 
    end 

我的新聞賽程:

news1: 
    name: Newstest 
    tags: 

標籤燈具:

one: 
    name: Music 

two: 
    name: Movie 

當我運行rake測試:機型,這兩個測試是失敗的,這是正確的。 當我給News Fixture添加標籤並再次運行測試時,測試通過。

news1: 
    name: Newstest 
    tags: one 

但是,當我刪除夾具中的標籤並運行rake測試:再次測試模型時,測試再次通過。 這是怎麼回事,刪除「one」標籤後測試是否成立。

要解決這個問題,我總是必須在控制檯中運行rake db:test:prepare。 我不知道我在做什麼錯。

回答

1

當您運行Rails測試時,您的測試夾具數據被加載到測試數據庫中。它不會被清除,除非你明確地清除它(例如,用rake db:test:prepare)。您可以通過使用SqliteBrowser之類的工具下載測試數據庫並檢查數據來驗證這一點。

因此,即使您正在更改測試運行之間的測試夾具,如果您未清除測試數據庫,以前的測試數據仍將存在。

+0

但耙測試不包括db:test:prepare命令? – ChrisS

+1

@Yoda不是我所知。這是我使用'rspec'的原因之一。如果在rails_helper.rb中包含'config.use_transactional_fixtures = true',則每個測試示例都將作爲單獨的事務在乾淨的數據庫上運行。 –