第10章 Pry, 强大的pry-rails和相关的几个好用gem

https://asciinema.org/a/0KtCL9HB1bP08wNHLfIeOMa8K

本章讲了如何定位❌,和排除bug. 

Pry  (5000🌟)

a Ruby console. 可以替代irb。增加了一些配合的gems,是一个杰出的debugger工具。

使用:在测试和开发环境使用:

gem "pry-rails"  # 取代irb ,在命令行输入pry

⚠️,安装pry时,在gem文件内输入gem 'pry-rails', :group => :development后这样才能取代rails console。 

 

gem "pry-byebug"       

#(文档要求放在:test内,或者全局内)(1300+🌟) 特点:用binding.pry一步一步的除错。

 

gem "pry-stack_explorer"  (#350🌟)

#使用show-stack命令 来go up and down the stack trace

 

gem "pry-rescue"

 


尝试使用pry:

 

rails console:搜索数据库记录,显示更清晰,字段用不同颜色标记,更容易分辨。

Pry允许检查作用域下的当前对象, 当输入self,返回顶级作用域main.

Pry使用Unix目录导航来读取对象树。 所以在Pry内输入ls:

会返回一个目录 是关于当前命名空间的事物:

ActiveSupport::ToJsonWithActiveSupportEncoder#methods: to_json

Rails::ConsoleMethods#methods: app  controller  helper  new_session  reload!
self.methods: inspect  to_s
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_  project

包括当前对象可以使用的方法和本地变量。其中project是之前创建的变量。

 

输入cd project就可以进入project对象的作用域了: 

 pry(#<Project>):1>

再输入self ,可以显示当前对象project的信息。

和命令终端一样,输入cd..返回上一级目录,输入cd返回最初目录。

如果在 pry(#<Project>):1> ls 

将会返回a bunch of stuff,一大堆project可以响应的方法(非常多,使用q加回车返回)

ls -h调用帮助信息。⚠️主要几个:

-m, --mehtods  显示公共方法

-M, --instance-methods   显示定义在模块或类中的方法

-i,   --ivars 显示instance variables(蓝色)和类变量(亮蓝色) 

 


show-source(当前作用域对象的方法名) 

pry(#<Project>):1> show-source on_schedule?会显示这个方法的具体信息
包括储存位置。方法的定义。
show-method和show-source似乎返回结果一样。没看文档。

show-doc查看Ruby核心方法。需要安装gem pry-doc
和irb一样  _ 可以显示最近使用的结果,   _ex_显示最近raised exception.

 


 

使用Pry 来定位测试失败的位置 

这是gem 'pry-byebug'中的方法。

在Rspec中使用,需要require 'pry' 

使用binding.pry方法 和gem ‘byebug’的一些功能类似。 

可以使用continue, finish, next, step方法。

continue,继续执行程序直到结束

finish: 继续执行直到当前frame结束

next: 继续执行当前frame内的命令

step: 跳过当前,进入下一个frame。 

 

你可以在测试任何地方插入binding.pry,你会得到当前作用域的全部内容。 

例子:

require "rails_helper"
RSpec.describe CreatesProject do
  let(:creator) {CreatesProject.new(
    name:"Project Runway", task_string: task_string)}
  describe "initialization" do
    let(:task_string) { "" }
    it "creates a project given a name" do
      creator.build
     # creator.pry  

      binding.pry 

      expect(creator.project.name).to eq "Project Runway"
    end
  end

到了binding.pry一行,就会进入Pry,和周边的作用域。可以直接进行各种操作。

 

也可以把pry发送给任何对象。比如使用creator.pry,测试时直接进入Pry,位置是本地变量creator,creator会作为顶级作用域显示:

CreatesProject
  initialization
[1] pry(#<CreatesProject>)>

 

这里可以使用edit命令, edit -c来打开binding.pry所定位的文件。 edit ClassName#method打开这个文件的方法。也可以打开实例变量,具体看edit -h方法。

在你修改完成后,会从新加载文件,让你继续。 

 


 

加载gem 'pry-stack_explorer'

⚠️ 和pry-byebug不兼容,可以一起用,但可能出现问题。 

pry-stack_explorer是一个插件,可以用于Pry REPL模式的开发, 让使用者可以在call-stack上进行导航。用户可以上下移动,检查state 甚至求代码的值evaluate code.

支持(点击查看文档): updownframe and show-stack

 

视频1,在frame直间移动查看

https://asciinema.org/a/eJnrZNaUhTl12AVtnCG304d0V 

说明:先输入show-stack,列出了目前为止的程序运行路径,包括调用了什么方法什么block。然后可以根据路径号,比如输入frame 9,即可查看这个方法的细节。

 

视频2,在一个caller中修改state

https://asciinema.org/a/0KtCL9HB1bP08wNHLfIeOMa8K 

说明: 输入show-stack后,想要变更frame7的输出。使用up 7到达7,然后修改state,会对之后的执行产生变化。


show-stack命令显示当前的backtrack

up命令移动到父frame.接受数字或字符串作为查询条件 

frame命令移动到指定的frame. 

⚠️。frame up down的区别没有弄明白 

 

 

 


 

rescue rspec 

使用这个命令进行测试,当出现错误的时候,Pry会立即进入这个❌的位置。

如:

rescue rspec spec/workflows/creates_project_spec.rb 

弹出一大坨:

From: /Users/chentianwei/下载的书籍/Rails 5 Test prescript 案例/basics/gatherer/spec/workflows/creates_project_spec.rb @ line 12 :
     7:   describe "initialization" do
     8:     let(:task_string) { "" }
     9:     it "creates a project given a name" do
    10:       creator.build
    11:       creator.pry
 => 12:       expect(creator.project.name).to eq "Project! Runway"
    13:     end
    14:   end
    15: #
    16:   # describe "mocking a failure" do
    17:   #   it "fails when we say it fails" do
RSpec::Expectations::ExpectationNotMetError:
expected: "Project! Runway"
     got: "Project Runway"
(compared using ==)
from /Users/chentianwei/.rvm/gems/ruby-2.5.0/gems/rspec-support-3.7.1/lib/rspec/support.rb:97:in `block in <module:Support>'
[1] pry(#<RSpec::ExampleGroups::CreatesProject::Initialization>)>

 

 

 

一起使用这些工具 能给你一个非常互动式的工作流。 后期运行测试通过rescue, 掉进Pry失败处,然后editing,然后再尝试直到测试通过。

 ⚠️,在pry内修改后再,try-again仍然会报告❌,所以尽量不使用。

另外rspec bisect ,bisect是一个隔离失败测试的系列方法,没有看。



几点提示:

 

  1.  如果ActiveRecord models不保存,问题最大的可能是对象创建失败于验证。因为记录不能保存所以发现一个本应存在的记录不在数据库,于是引起测试失败❌。可以使用save!或create!,强制失败后跳出❌提示。
  2. Rails会忽略没有指定到permit方法的参数,并在log中记录。当你想弄懂为什么方法明确调用了这个属性但结果对象中不存在这个属性时,考虑一下permit的参数🚫。
  3. 在集成测试中,不要忘记log in。 save_and_open_page命令让你看到你没有登陆。

 

 


 

Wiki


  • Source code browsing 源码浏览( pry-doc gem)
  • Documentation Browsing文档浏览show-doc
  • Live Help system活泼的帮助系统
  • 在editor中打开方法 (edit Class#method, edit my_method)
  • 默认符号高亮(自定义颜色安装pry-theme gem)
  • Command shell integration (start editors, run git, and rake from within Pry)
  • Gist integration
  • 状态导航 (cd, ls and friends)
  • Runtime invocation运行时的文件存取:  use Pry as a developer console or debugger(当前环境的绑定binding.pry, 对象的存取my_object.pry)
  • Exotic object support外来对象的支持 (BasicObject instances, IClasses, ...)
  • 灵活强大的命令系统
  • 可以看和重放历史
  • Many convenience commands inspired by IPython, Smalltalk and other advanced REPLs
  • A wide-range number of plugins that provide remote sessions, full debugging functionality, and more.
Pry也瞄准了取代IRB。他是一个尝试:用REPL驱动开发Ruby语言。不是很强力,一个方向。什么是read–eval–print loop 见wiki

 

Pry提供了灵活的用户客制化。 

pry --help


 


Editor中的使用。

 

配合cd, cd .., ls使用。

edit Class, edit Class#method, edit my_method都可以定位到不同的位置。

^X是退出的意思ctrl+x. ^代表control按键。 

^O是writeout写出:保存修改的文件。 看提示然后回车就行了。

^G是帮助。

 


 Live Help System

 

输入help则显示所以Pry可以用的命令。

详细的使用 command_name --help 


 

使用gem pry-rails  可以替代默认的rails console:

在加载了Rails console helper 之外还增加了一些有用的命令。 

 


 

Command Shell Integration (未弄明白)

 

使用 shell-mode来把当前工作目录合并进Pry prompt并附带上完全的文件目录名。具体的不懂。


 

 

 

 

 

posted @ 2018-06-04 22:01  Mr-chen  阅读(703)  评论(0编辑  收藏  举报