ruby rails为rspec测试创建了have_list_of_links实用程序

时间:2013-03-19 20:30:10

标签: ruby-on-rails ruby helper utility matcher

我是ruby / rails的新手,并且做了一个turorial我想知道如何解决我的小问题......

我有描述“有效信息”,用于测试用户使用有效信息登录时应该或不应该发生的事情。 在此过程中,我希望能够验证新页面上是否存在某些链接。在tuto中,只有2个链接,所以我们这样做:

it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Sign out', href: signout_path) }

但是,如果我们让10个链接呢?我认为帮忙没有问题会更容易吗?但我无法弄清楚如何写它。这就是我带来的......

 lol = Hash[ 'Profile'  => 'user_path(user)',
             'Sign out' => 'signin_path']
 it { should have_list_of_links(lol) }

然后在$ PROJECT / spec / support / utilities.rb文件中,我定义了新的* have_list_of_links *函数:

RSpec::Matchers.define :have_list_of_links do |lol|
  match do |page|
    lol.each_pair do |label, link| 
                page.should have_link(label, href: link) 
    end
  end
end

我知道这不是正确的做法,但我无法弄明白该怎么做......

感谢。

1 个答案:

答案 0 :(得分:1)

我在这里可以看到两个小问题。首先使用let语法在rspec中定义memoized变量。在构建哈希时,第二次将括号括在 * _ path 帮助器周围。

如此绝对:

lol = Hash[ 'Profile'  => 'user_path(user)',
            'Sign out' => 'signin_path']

有:

let(:lol) { Hash[ 'Profile'  => user_path(user),
                  'Sign out' => signin_path] }

您的描述块可能是:

describe "with valid information" do
  let(:lol) { Hash[ 'Profile'  => user_path(user),
                    'Sign out' => signin_path] }

  it { should have_list_of_links(lol) }
end

作为副作用,我将向您展示一个小例子。鉴于您在 $ PROJECT / spec / support / utilities.rb 文件中定义了匹配器,应用程序路由等...已正确设置,并且您的视图中有链接。

describe "Users pages" do
  before { visit root_path }
  let(:values) { Hash['Index' => users_path, 
                      'Sign out' => signout_path, 
                      'Sign in' => signin_path] }

  subject { page }

  describe "with valid informations" do
    it { should have_list_of_links(values) }
  end
end  

运行rspec:

> rspec
.

Finished in 0.00267 seconds
1 example, 0 failures

Randomized with seed 67346

运行rspec -f文档

>rspec -f documentation
Users pages
  with valid informations
    should have link "Sign in"

Finished in 0.00049 seconds
1 example, 0 failures

Randomized with seed 53331

这不明确和误导,特别是文档切换。在新应用程序上运行rspec -f文档是一种常见的做法你只需要动手(如果他们使用rspec ofc)。为了更好地了解正在发生的事情。

如果你改为:

describe "Users pages" do
  before { visit root_path }

  subject { page }

  describe "with valid informations" do
    it { should have_link('Index', href: users_path) }
    it { should have_link('Sign out', href: signout_path) }
    it { should have_link('Sign in', href: signout_path) }
  end
end  

运行rspec:

>rspec
...

Finished in 0.0097 seconds
3 examples, 0 failures

Randomized with seed 53347

运行rspec -f文档

>rspec -f documentation
Users pages
  with valid informations
    should have link "Index"
    should have link "Sign out"
    should have link "Sign in"

Finished in 0.00542 seconds
3 examples, 0 failures

Randomized with seed 40120

我个人喜欢第二种情况(更详细一种)。当测试数量增加且测试结构变得越来越复杂时,它的价值就会增加。您只需运行 rspec -f文档即可学习如何使用应用程序,甚至无需转到用户手册/教程。