设计视图规范

Devise view specs

我习惯于编写至少检查以下内容的视图规范:

expect(view).to receive(:title).with('Required page title here')

title 是我编写的用于设置页面标题的辅助方法。)现在我正在尝试为我的 Devise 视图编写规范,看起来像:

- title 'Lost Password'
.row
  .col-lg-6
    = form_for resource, as: resource_name, url: password_path(resource_name) do |f|
      = render 'layouts/errors', object: resource
      .form-group
        = f.label :email
        = f.text_field :email, class: 'form-control', autofocus: true
      = f.submit 'Send me the instructions', class: 'btn btn-primary'
    %hr
    = render 'devise/shared/links'
  .col-lg-6
    = render 'devise/shared/advantages'

resourceresource_name 由 Devise 定义。

如果我 运行 视图上的以下规范:

require 'rails_helper'
describe 'devise/passwords/new', type: :view do
  it 'sets the page title' do
    expect(view).to receive(:title).with('Lost Password')
    render
  end
end

上面写着:undefined local variable or method 'resource'。我试过了:

allow(view).to receive(:resource).and_return(User.new)

但后来我得到 [snip, long class definition] does not implement: resource

我该如何进行这项工作?我不想将 Capybara 用于像这样微不足道的事情。

您可以通过在测试助手中编写一个简单的实现来自己提供这些助手:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end