尝试通过方法选项定义should或should_not

时间:2014-05-05 12:53:03

标签: ruby-on-rails ruby rspec rspec-rails

我需要在每个网站页面上测试侧边栏。 我定义用户方法test_all_sidebars并填写

def test_all_sidebars
    test_header
    test_contacts
    test_news
    test_footer
end

然后我需要测试一个页面2个侧边栏不会显示。例如:

describe "Home page" do
    before { visit root_path }

    test_all_sidebars
end
describe "Contact page" do
    before { visit contact_path }

    test_header
    test_footer
    test_news(false)
    test_contact(false)
end

我尝试使用此选项定义test_newstest_contact

def test_contacts(flag: true)
    describe "sidebar with contacts" do
        it { (:flag ? should : should_not) have_content('phone: ') }
    end

但它不起作用。我有unexpected tIDENTIFIER, expecting '}'

我尝试使用let

def test_contacts(flag: true)
    if :flag then
        let(:sh) { should }
    else
        let(:sh) { should_not }
    end
    it { sh have_content('phone: ') }
end

但这仍然无效。

我的问题:怎么样?如何使用输入数据条件在同一方法中使用should / should_not

1 个答案:

答案 0 :(得分:1)

def test_contacts(flag: true)
  describe "sidebar with contacts" do
    it { (:flag ? should : should_not) have_content('phone: ') }
  end
end

这段代码出了多大问题:

  1. :flag 总是真实,因为它是一个符号。如果您要检查值是否通过true,则应使用flag(变量),而不是:flag(符号)
  2. shouldshould_not是方法,因此实际上您需要调用should(have_content('phone: ')should_not(have_content('phone: ') - 您无法将方法调用与发送它的变量分开
  3. 因此,在您的描述中,您的代码应如下所示:

    it { flag ? should(have_content('phone: ')) : should_not(have_content('phone: ') }
    

    除此之外,我从未见过这种用于编写rspec测试用例的模式,我很确定你最好使用更好的习语,如shared_examples_for