2017-03-10 29 views
-1

我寫了一個測試,檢查來自同一公司內的用戶的推薦。在斷言中,我檢查引用是否爲空,然後在最終檢查引用是否爲空之前運行destroy_referrals方法。 assert referrals.empty?返回一個失敗,檢查.empty?破壞後不工作

1) Failure: CompanyTest#test_destroy_referrals_with_referrals [test/models/company_test.rb:634]: Expected false to be truthy.

company_test.rb

def test_destroy_referrals_with_referrals 
    company = companies(:default) 
    referrals = company.users.map {|u| u.referrals unless u.referrals.empty?}.uniq.compact 

    assert !referrals.empty? 
    company.destroy_referrals 
    assert referrals.empty? 
end 

我期待,最後斷言將確認轉介已被刪除。任何想法爲什麼會引發失敗?

回答

2

引用是一個數組對象。你加載一次,它保留在內存中。你爲什麼期望它改變?

重新閱讀。

referrals = company.users.map {|u| u.referrals unless u.referrals.empty?}.uniq.compact 

assert !referrals.empty? 
company.destroy_referrals 

company.reload # just for good measure 
referrals = company.users.map {|u| u.referrals unless u.referrals.empty?}.uniq.compact 
assert referrals.empty? 
+0

CPDD? :) 愛它。 – mudasobwa

+0

啊,是的,這絕對是:)讓我成爲一個瘋狂的高效開發者:) –

+0

我明白了;我們加載一個數組,並且因爲它駐留在內存中,我們需要在檢查方法是否被執行之前重新加載相同的數組。 – VegaStudios

3

問題是,您已經提前準備好推介,並且從未改變過它。爲了使測試通過,您應該重新加載它們:

def test_destroy_referrals_with_referrals 
    company = companies(:default) 
    referrals = -> { company.users.map(&:referrals).reject(&:empty?) } 

    assert !referrals.().empty? 
    company.destroy_referrals 
    assert referrals.().empty? 
end 
+1

@SergioTulentsev該死的。現在它會:) – mudasobwa

+0

這也是一個很好的答案,但是,我不想寫它作爲一個多行塊....不知道爲什麼,但試圖「打印」時拋出新的錯誤等。 – VegaStudios

+0

寫它在一條線上。答案已更新。 – mudasobwa