2015-01-07 44 views
0

我想重构我的代码,从潜在的三行到只有一行。水豚/ RSpec - 检查数组的内容

这里的片段:

# capture an array of the three stats: impressions/clicks/AVT 

    stats = page.all('.sub') 

    # check our array.... 

    expect(stats[0]).to have_content("Impressions") 
    expect(stats[1]).to have_content("Clicks") 
    expect(stats[2]).to have_content("Average") 

我所需要的水豚have_content与RSpec的contain_exactly的平衡。

喜欢的东西:

expect(stats).to contain_exactly("Impressions", "Clicks", "Average") 

导致:

Failure/Error: expect(stats).to contain_exactly("Impressions", "Clicks", "Average") 
    expected collection contained: ["Average", "Clicks", "Impressions"] 
    actual collection contained: [#<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/div[1]/div[1]">, #<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/div[2]/div[1]">, #<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/abbr/div[1]">] 
    the missing elements were:  ["Average", "Clicks", "Impressions"] 
    the extra elements were:  [#<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/div[1]/div[1]">, #<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/div[2]/div[1]">, #<Capybara::Element tag="div" path="/html/body/div[2]/div[2]/div/div[1]/abbr/div[1]">] 

如何将一个重构呢?

回答

2

我认为这应该工作:

# capture an array of the three stats: impressions/clicks/AVT 

stats = page.all('.sub').map(&:text) 

expect(stats).to contain_exactly("Impressions", "Clicks", "Average") 

更新

使用RSpec 3开始,你能做到以下几点,如果你正在寻找部分匹配:

expect(stats).to contain_exactly(
           a_string_matching(/Impressions/), 
           a_string_matching(/Clicks/), 
           a_string_matching(/Average/) 
           ) 
+0

像魅力一样工作,除了现在我认为我只为自己创造了更多的工作,因为这3个关键字是更大的动态字符串的一部分,因此不会在“contains_完全“断言。 IE“总体印象0”。 – ilrein

+0

看看我的更新是否解决了你的'新'问题 – sjaime