LoginSignup
4

More than 5 years have passed since last update.

doctest-rspec gem でコメントに書いた ruby のコードを rspec で実行する

Posted at

doctest-rspec gem でコメントに書いた ruby のコードを rspec で実行します

インストール

$ gem install doctest-rspec

サンプル

検証コード

  • プロダクトコード
lib/sample.rb
class FizzBuzz
  # list
  #
  # Usage:
  #   >> FizzBuzz.new.run(15)
  #   => ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]
  def run(limit)
    (1..limit).map do |num|
      case
      when fizzbuzz?(num) then "FizzBuzz"
      when buzz?(num) then "Buzz"
      when fizz?(num) then "Fizz"
      else num.to_s
      end
    end
  end

  # fizzbuzz
  #
  # Usage:
  #   >> FizzBuzz.new.fizzbuzz?(15)
  #   => true
  #   >> FizzBuzz.new.fizzbuzz?(16)
  #   => false
  def fizzbuzz?(num)
    num % 15 == 0
  end

  # buzz
  #
  # Usage:
  #   >> FizzBuzz.new.buzz?(5)
  #   => true
  #   >> FizzBuzz.new.buzz?(4)
  #   => false
  def buzz?(num)
    num % 5 == 0
  end

  # fizz
  #
  # Usage:
  #   >> FizzBuzz.new.fizz?(3)
  #   => true
  #   >> FizzBuzz.new.fizz?(4)
  #   => false
  def fizz?(num)
    num % 3 == 0
  end
end
  • テストコード
spec/sample_spec.rb
require 'doctest/rspec'
require 'sample'

describe FizzBuzz do
  doctest FizzBuzz
end

テスト

  • 正常に動作するケース
$ rspec -fd

FizzBuzz
  doctests for FizzBuzz
    at /path/to/lib/sample.rb:6
    at /path/to/lib/sample.rb:22
    at /path/to/lib/sample.rb:24
    at /path/to/lib/sample.rb:33
    at /path/to/lib/sample.rb:35
    at /path/to/lib/sample.rb:44
    at /path/to/lib/sample.rb:46

Finished in 0.00183 seconds (files took 0.11472 seconds to load)
7 examples, 0 failures
  • 意図的にバグを仕込んだ場合
lib/sample.rb
# 略
  def fizz?(num)
    # わざと 4 にします
    num % 4 == 0
    #num % 3 == 0
  end
# 略
$ rspec -fd
FizzBuzz
  doctests for FizzBuzz
    at /path/to/lib/sample.rb:6 (FAILED - 1)
    at /path/to/lib/sample.rb:22
    at /path/to/lib/sample.rb:24
    at /path/to/lib/sample.rb:33
    at /path/to/lib/sample.rb:35
    at /path/to/lib/sample.rb:44 (FAILED - 2)
    at /path/to/lib/sample.rb:46 (FAILED - 3)

Failures:

  1) FizzBuzz doctests for FizzBuzz at /path/to/lib/sample.rb:6
     Failure/Error: DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure }
       expected ["1", "2", "3", "Fizz", "Buzz", "6", "7", "Fizz", "9", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"] to equal ["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"]
# スタックトレースは省略

  3) FizzBuzz doctests for FizzBuzz at /path/to/lib/sample.rb:46
     Failure/Error: DEFAULT_FAILURE_NOTIFIER = lambda { |failure, _opts| raise failure }
       expected true to equal false
# スタックトレースは省略

Finished in 0.0152 seconds (files took 0.10469 seconds to load)
7 examples, 3 failures

Failed examples:

rspec './spec/sample_spec.rb[1:1:1]' # FizzBuzz doctests for FizzBuzz at /path/to/lib/sample.rb:6
rspec './spec/sample_spec.rb[1:1:6]' # FizzBuzz doctests for FizzBuzz at /path/to/lib/sample.rb:44
rspec './spec/sample_spec.rb[1:1:7]' # FizzBuzz doctests for FizzBuzz at /path/to/lib/sample.rb:46

雑感

Elixir の Doctests 相当のことができました。
気になるのは日本でこのライブラリを使っている人がほとんどいなそうなことですね。

外部資料

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4