コマンドラインからrspecを走らせても、エラーにならず、rspec-modeのrspec-verify-singleとかから起動する時だけエラーになっちゃう時がありました。
背景
テストはこんな感じ。turnipのfeatureです。
やってることは
- Twitte.updateメソッドをtweetするんじゃなくて、標準出力するように偽装する
- 標準出力をStringIOのインスタンスに書き換ええる
- テストでtweetの内容(
stdout
)と期待値を確認する - afterでオリジナルの標準出力に戻す
ということをしています。
spec_helper.rb
RSpec.configure do |config|
config.before(:each) do
allow(Twitter).to receive(:update) {|tweet| puts tweet}
@orig_stdout = $stdout
$stdout = @stringio = StringIO.new
end
config.after(:each) do
$stdout = @orig_stdout
end
end
bot.feature
シナリオ: botコマンド
前提 日時が "2013-07-30 19:00" となっていること
ならば "あつきものむかし大坂夏御陣 夏目漱石" とつぶやかれていること
global_steps.rb
step ":tweet とつぶやかれていること" do |tweet|
expect($stdout.string.chomp).to eq tweet
end
backtraceはこんな感じ。
bundle/ruby/2.1.0/gems/rspec-core-3.1.7/lib/rspec/core/notifications.rb:226:in `strip': invalid byte sequence in US-ASCII (ArgumentError)
対処
調べるとrspec-verify-singleとかした時だけ、 Encoding.default_external
が US-ASCII
になっていた。
なので
spec_helper
RSpec.configure do |config|
Encoding.default_external = Encoding::UTF_8
end
と追加してあげればok。
追記
そもそもturnipのfeatureをrspec-verifyってできないのですが、emacsで独自関数を作っています。 私のconfigファイル
多分、発生している原因はemacs内でrubyを起動すると Encoding.default_external
が Encoding:US-ASCII
になっているのが原因なので、turnipを介しているのが原因ではないと思います。
根本解決はemacs内での環境変数LANGをちゃんと指定するのかなぁ。