2017-03-10 28 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