RSpec - 从'should'升级到'expect'语法的脚本?

时间:2013-10-24 15:48:46

标签: ruby rspec

我有数百个文件也有数百个“应该”的陈述。

是否有任何自动方式将这些文件更新为新语法?

我想要创建新文件的选项,也可以内联修改现有文件。

2 个答案:

答案 0 :(得分:4)

迟来的更新,主要针对那些可能通过搜索引擎找到本页面的人。

为此目的使用Yuji Nakayama的优秀Transpec宝石。我现在已经在不同的项目上使用它超过10次而没有问题。

来自网站:

  

Transpec可让您立即将RSpec 2规格升级到RSpec 3。它支持几乎所有RSpec 3更改的转换,并且由RSpec团队推荐。

     

此外,您可以在RSpec 2项目中使用它,即使您现在不打算将其升级到RSpec 3。

答案 1 :(得分:3)

sed是一个很好的工具。

以下将处理当前目录中的所有文件,并将它们写入_spec_seded目录中的新文件。这目前处理大约99%以上的更改,但可能仍然需要进行一些手动更改(数量取决于您的代码和编码样式)。

与sed脚本一样,您应该检查结果,运行差异并手动查看文件。理想情况下,您使用的是git,这有助于使差异变得更加容易。

filenum=1
find . -type f -name '*_spec.rb' | while read file; do
  mkdir -p ../_spec_seded/"${file%/*}"
  echo "next file...$filenum...$file"
  let filenum+=1
  cp "$file" ../_spec_seded/"$file"

  sed -i '                           # Exclude:
/^ *describe .*do/! {                # -describe...do descriptions
  /^ *it .*do/! {                    # -it...do descriptions
    /^[[:blank:]]*\#/! {             # -comments
      /^ *def .*\.should.*/! {       # -inline methods
        /\.should/ {
          s/\.should/)\.to/                      # Change .should to .to
          s/\(\S\)/expect(\1/                    # Add expect( at start of line.
          /\.to\( \|_not \)>\=/ s/>\=/be >\=/    # Change operators for
          /\.to\( \|_not \)>[^=]/ s/>/be >/      # >, >=, <, <= and !=
          /\.to\( \|_not \)<\=/ s/<\=/be <\=/
          /\.to\( \|_not \)<[^=]/ s/</be </
          /\.to\( \|_not \)\!\=/ s/\!\=/be \!\=/
        }

        /\.to +==\( +\|$\)/ s/==/eq/
        /=\~/ {                                      # Change match operator
          s/=\~/match(/
          s/$/ )/
          s/\[ )$/\[/
        }

        s/[^}.to|end.to]\.to /).to /                 # Add paren
        /eq ({.*} )/ s/ ({/ ( {/                     # Add space
        /to\(_\|_not_\)receive/ s/_receive/ receive/ # receive
        /\.to eq \[.*\]/ {
          s/ eq \[/ match_array([/
          s/\]$/\])/
        }

        /expect.*(.*lambda.*{.*})/ {                 # Remove unneeded lambdas
          s/( *lambda *{/{/
          s/ })\.to / }\.to /
        }

        /expect *{ *.*(.*) *})\.to/ {                  # Fix extra end paren
          s/})\.to/}\.to/
        }
      }
    }
  }
}' ../_spec_seded/"$file"
done

请谨慎使用。目前,该脚本会在_seded/中创建新文件,以便首先进行审核以确保安全。该脚本放在/spec目录中并从那里运行。 如果您有数百个文件,这可以为您节省数小时或数天的工作量! 如果你使用这个,我建议“步骤2”手动将文件从_spec_seded复制到spec本身并运行它们。我建议您不要只重命名整个目录。首先,spec_helper.rb等文件目前尚未复制到_spec_seded

2013/11/18注意:我继续升级此脚本。覆盖更多边缘情况并且还使匹配更具体并且还排除更多边缘情况,例如评论专栏。

P.S。应该查看的差异(从项目目录根目录):

diff -r /spec /_spec_seded

git也有很好的差异选项,但我喜欢在将文件添加到git之前查看。