如何在RSpec视图测试中获取assign创建的实例变量以符合RuboCop规范?
解决RSpec视图测试中避免实例变量并获取assign创建的变量
在RSpec视图测试里,assign方法本身会返回你创建的对象,不需要用实例变量接收,直接用局部变量存储即可——这样既满足视图测试必须使用assign的要求,又符合RSpec风格指南禁止使用实例变量的规范。
修改后的代码(推荐写法)
# frozen_string_literal: true require 'rails_helper' RSpec.describe 'import_files/edit', type: :view do # 用let定义测试对象,符合RSpec最佳实践,延迟加载提升效率 let(:import_file) do ImportFile.create!( path: 'MyString', file_type: 1 ) end before do assign(:import_file, import_file) end it 'renders the edit import_file form' do render assert_select 'form[action=?][method=?]', import_file_path(import_file), 'post' do assert_select 'input[name=?]', 'import_file[path]' assert_select 'input[name=?]', 'import_file[file_type]' end end end
更简洁的直接赋值写法
如果不想用let,也可以直接在before块里把assign的返回值赋值给局部变量:
# frozen_string_literal: true require 'rails_helper' RSpec.describe 'import_files/edit', type: :view do before do # 用局部变量接收assign的返回值,替代实例变量 import_file = assign(:import_file, ImportFile.create!( path: 'MyString', file_type: 1 )) end it 'renders the edit import_file form' do render assert_select 'form[action=?][method=?]', import_file_path(import_file), 'post' do assert_select 'input[name=?]', 'import_file[path]' assert_select 'input[name=?]', 'import_file[file_type]' end end end
核心说明
assign(:import_file, 对象)的作用是把对象传递给视图使用,同时该方法会返回这个对象,所以可以用局部变量存储返回值,供测试代码调用(比如生成路由的import_file_path(import_file))。- 用
let定义测试对象能让代码结构更清晰,同时利用其延迟加载的特性优化测试性能。
内容的提问来源于stack exchange,提问作者pedz
相关产品推荐
相关产品推荐

