6

我有一个测试需要遍历数组中的 5 个元素,然后验证所有元素是否在页面上显示为列表项。我有下面的代码,这是最后一个带有评论“#get the first 5 blog posts”的测试。当我运行测试时,看不到这个测试,因为只执行了 4 个测试。如果我将 'it {} ' 语句移到数组代码博客之外,则测试变得可见。如何正确编写此测试以便它可以正确循环?

require 'spec_helper'
require 'requests/shared'

describe "Header" do

    let (:title) { "my title" }

    subject { page }

    before { visit root_path }

    describe "Home" do
        it { should have_selector('title', text: title) }
        it { should have_selector('header') }
        it { should have_link 'Home', href: root_path}


        describe "Blog link exist" do
                it { should have_link 'Blog'}
        end

        describe "Blog list elements" do

            #get the first 5 blog posts
            Blog.all(limit:5).each do |blog|    
                it { should have_selector('ul.accordmobile li#blog ul li a', text: blog.title, href: blog_path(blog.id)) }
            end
        end 
end

结尾

4

2 回答 2

13

由于 RSpec 是 DSL,因此您不能以这种方式嵌套测试。RSpec 在运行测试之前首先读取示例规范文件。所以它会Blog.all在任何测试运行之前达到。这也意味着没有数据库人口。因此,除非之前的测试运行有剩余状态,否则Blog.all将返回[].

尝试在 a 中创建对象before也不适用于您在问题中编写测试的方式。同样,这是由于Blog.all在解析时before执行,而在测试时执行。

为了实现你想要的,你可能需要打破“只测试一件事”的规则并嵌套Blog.allit块内:

it "list the first five posts" do
  Blog.all(limit:5).each do |blog|
    expect(page).to have_selector('ul.accordmobile li#blog ul li a',
                                  text: blog.title,
                                  href: blog_path(blog.id))
  end
end
于 2013-05-23T00:35:55.477 回答
1

重要的!对于希望循环,要运行您应该有 5 个或超过 5 个博客。

比做

可能这应该被重新考虑为

  Blog.limit(5).each do |blog|    
      it { should have_selector('ul.accordmobile li#blog ul li a', text: blog.title, href: blog_path(blog.id)) }
            end
于 2013-05-22T18:02:44.753 回答