我有一个测试,需要循环遍历数组中的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
结束
解决方法
由于RSpec是DSL,因此无法以这种方式嵌套测试.在运行测试之前,RSpec首先读取示例spec文件.因此,在运行任何测试之前,它会点击Blog.all.这也意味着没有数据库的人口.因此,除非先前的测试运行剩余状态,否则Blog.all将返回[].
尝试在之前创建对象将无法在您的问题中编写测试的方式.同样,这是由于Blog.all在解析时执行,而之前是在测试时执行.
为了实现你想要的,你可能需要打破“仅测试一件事”规则并将Blog.all嵌套在它的块中:
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',href: blog_path(blog.id)) end end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。