【问题标题】:using rspec to test that a URL exists for a sinatra app使用 rspec 测试 sinatra 应用程序的 URL 是否存在
【发布时间】:2015-09-05 16:36:14
【问题描述】:

我正在尝试将 people_controller.rb 文件与 index.erb 文件链接,以便用户可以单击 /people 页面中的名称并通过 people/:id 路由转到唯一页面。这在浏览器中有效,但该应用程序一直未能通过我给出的规范测试。我认为我收到的规范文件不正确,实际上并没有测试链接是否存在。

这是我的 people_controller.rb 文件:

get "/people" do
    @people = Person.all

    erb :"/people/index"
end

get "/people/:id" do
    @person = Person.find(params[:id])
    birthdate_string = @person.birthdate.strftime("%m%d%Y")
    birth_path_num = Person.get_birth_path_num(birthdate_string)
    @message = Person.get_message(birth_path_num)

    erb :"/people/show"
end

这是我的 index.erb 文件:

<h1>People</h1>

<table>

    <thead>
        <th>Name</th>
        <th>Birthdate</th>
    </thead>

    <tbody>
        <% @people.each do |person| %>
            <tr>
                <td>
                    <a href="<%="people/#{person.id}" %>">
                        <%= "#{person.first_name} #{person.last_name}" %>
                    </a>
                </td>
                <td>
                    <%= "#{person.birthdate}" %> 
                </td>
            </tr>
        <% end %>
    </tbody>

</table>

这是我的规范文件:

require 'spec_helper'

describe "Our Person Index Route" do
  include SpecHelper

  before (:all) do
    @person = Person.create(first_name: "Miss", last_name: "Piggy", birthdate: DateTime.now - 40.years )
  end

  after (:all) do
    @person.delete
  end

  it "displays a link to a person's show page on the index view" do
    get("/people")
    expect(last_response.body.include?("/people/#{@person.id}")).to be(true)
  end
end

这是我尝试使用规范文件运行 rspec 时收到的失败消息:

Failure/Error: expect(last_response.body.include?("/people/#{@person.id}")).to be(true)
expected true
got false
#  ./spec/people_show_link_spec.rb:16:in 'block (2 levels) in <top (required)>'

expect 方法实际上是检查链接是否存在,还是只检查人员页面上是否存在文本字符串“/people/#{@person.id}”?如果它实际上正在检查链接,它不应该以某种方式包含“a href”(或其他指示链接的关键字)吗?

【问题讨论】:

    标签: ruby activerecord rspec routes sinatra


    【解决方案1】:

    它只检查是否存在文本字符串“/people/#{@person.id}”。

    更好的期望可能是:

    expect( page ).to have_css "a[href='/people/#{@person.id}']"
    

    expect( page ).to have_link "#{person.first_name} #{person.last_name}"
    

    【讨论】:

    • 命令终端说页面是一个未定义的局部变量。 @page 也不起作用,因为它没有在任何文件中定义。您是否有引用 .to have_css 或 .to have_link 方法的文档或资源?我还没有看到它们被 rspec 引用。我想我可能需要以某种方式使用重定向方法,但我不确定。
    • 我应该注意我没有水豚。我认为 .to have_css 和 .to_have 链接是 Capybara 的方法,但我只有 Sinatra。
    • Capybara 与 Sinatra 合作。如果您想做检查 HTML 节点之类的事情,那么您可能想要使用它。您可能需要配置 RSpec 以同时使用 Rack Test 和 Capybara:
    • 这是一个 Ruby on Rails 类,上面的规范应该在没有 Capybara 的情况下按原样工作。 Capybara 似乎确实是让规范工作的最简单方法,但我真的很想看看是否有办法在没有它的情况下重写规范,因此它正在检查链接是否存在。
    • 您还有其他选择。您可以检查准确的 HTML 字符串、使用正则表达式或使用 Nokogiri 来解析响应。 Capyabara 比这 3 个选项更好。
    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 2012-01-20
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多