Crystal のテスト(Spec)の機能一覧（2016/06/21時点）

Crystal のテスト(Spec) の機能を一通り確認します。

## <i class='fa fa-sitemap'></i> Structure
### <i class='fa fa-sitemap'></i> describe / context / it
```crystal
require "spec"

class Person
  getter name : String
  getter age : Int32
  property friends : Array(Person)

  def initialize(@name, @age)
  end
end

describe Person do
  context "context1" do
    it "it1" do
      true.should be_true
      true.should eq(true)
    end
  end
end
```

* 実行結果

```bash
.

Finished in 0.58 milliseconds
1 examples, 0 failures, 0 errors, 0 pending
```

### <i class='fa fa-stop'></i> pending
保留する

```crystal
require "spec"

class Person
  getter name : String
  getter age : Int32
  property friends : Array(Person)

  def initialize(@name, @age)
    @friends = [] of Person
  end
end

describe Person do
  context "context1" do
    pending "pending" do
      true.should be_true
      true.should eq(true)
    end
  end
end
```

* 実行結果

```bash
*

Pending:
  Person context1 pending

Finished in 0.63 milliseconds
1 examples, 0 failures, 0 errors, 1 pending
```

### <i class='fa fa-warning'></i> fail
意図的に例外を発生させる

```ruby
require "spec"

class Person
  getter name : String
  getter age : Int32
  property friends : Array(Person)

  def initialize(@name, @age)
    @friends = [] of Person
  end
end

describe Person do
  it "it1" do
    fail "fail readson"
  end
end
```

* 実行結果

```bash
F

Failures:

  1) Person it1
     Failure/Error: fail "fail readson"

       fail readson

     # /path/to/fail.cr:15

Finished in 0.57 milliseconds
1 examples, 1 failures, 0 errors, 0 pending

Failed examples:

crystal spec /path/to/fail.cr:14 # Person it1
[Finished in 0.695s]
```

## <i class='fa fa-list'></i> Expectation
### <i class='fa fa-cube'></i> be - Spec::Be
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L108-L141" target="_blank">Spec::Be - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
比較演算( >, >=, <, <= )用の Expectation

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be" do
  it "範囲 1..3 の整数の乱数は1以上3以下" do
    actual = rand(1..3)
    actual.should be >= 1
    actual.should be <= 3
  end

  it "範囲 1...3 の整数の乱数は1以上3未満" do
    actual = rand(1...3)
    actual.should be >= 1
    actual.should be < 3
  end

  it "a..z の後半分の中から任意の1要素を抽出すると n より大きい文字コードである" do
    list = ('a'..'z').to_a
    actual = list[(list.size / 2)..-1].sample
    actual.should be > 'n'
  end
end
```

### <i class='fa fa-cube'></i> be(value) - Spec::BeExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L27-L42" target="_blank">Spec::BeExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
実行結果と期待値を `same?` メソッドで比較した結果で判定します。  
`same?` は `object_id` による比較＝同一性の比較を行います。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be value" do
  it "同値かつ同一のケース" do
    a = [1, 2, 3]
    a.should be(a)
  end

  it "同値だが同一ではないケース" do
    [1, 2, 3].should_not be([1, 2, 3])
  end
end
```

### <i class='fa fa-cube'></i> be_close(expected, delta) - Spec::CloseExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L75-L90" target="_blank">Spec::CloseExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
浮動小数点の演算など、誤差を加味した比較を行います。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be close" do
  it "浮動小数点の誤差を加味した比較" do
    (1 / 3.0).should be_close(0.33, 0.1)
  end
end
```

### <i class='fa fa-cube'></i> be_false
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L201-L203" target="_blank">expectations - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
falseかどうか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be false" do
  it "false" do
    false.should be_false
  end

  it "true" do
    true.should_not be_false
  end
end
```

### <i class='fa fa-cube'></i> be_falsey - Spec::BeFalseyExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L60-L72" target="_blank">Spec::BeFalseyExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
falseyかどうか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be falsey" do
  it "falsey" do
    false.should be_falsey
    nil.should be_falsey
  end

  it "truthy" do
    true.should_not be_false
    'a'.should_not be_false
  end
end
```

### <i class='fa fa-cube'></i> be_nil
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L213-L215" target="_blank">expectations - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
nilかどうか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be nil" do
  it "nil" do
    nil.should be_nil
  end

  it "not nil" do
    false.should_not be_nil
    true.should_not be_nil
  end
end
```

### <i class='fa fa-cube'></i> be_true
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L197-L199" target="_blank">expectations - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
trueかどうか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be true" do
  it "true" do
    true.should be_true
  end

  it "false" do
    false.should_not be_true
  end
end
```

### <i class='fa fa-cube'></i> be_truthy - Spec::BeTruthyExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L45-L57" target="_blank">Spec::BeTruthyExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
truthyかどうか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "be truthy" do
  it "truthy" do
    true.should be_truthy
    'a'.should be_truthy
  end

  it "falsey" do
    false.should_not be_truthy
    nil.should_not be_truthy
  end
end
```

### <i class='fa fa-cube'></i> contain(expected) - Spec::ContainExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L171-L186" target="_blank">Spec::ContainExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
実行結果が期待値を含んでいるかどうか判定します。  
内部実装としては `include?` で判定しています。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "contain" do
  it "include" do
    [1, 2, 3].should contain(1)
    [1, 2, 3].should contain(3)
  end

  it "not include" do
    [1, 2, 3].should_not contain(0)
    [1, 2, 3].should_not contain(4)
  end
end
```

### <i class='fa fa-cube'></i> eq(value) - Spec::EqualExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L3-L24" target="_blank">Spec::EqualExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
実行結果と期待値を `==` メソッドで比較した結果で判定します。  
`==` は同値性の比較を行います。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "eq value" do
  it "同値かつ同一のケース" do
    a = [1, 2, 3]
    a.should eq(a)
  end

  it "同値だが同一ではないケース" do
    [1, 2, 3].should eq([1, 2, 3])
  end
end
```

### <i class='fa fa-cube'></i> match(value) - Spec::MatchExpectation
#### <i class='fa fa-diamond' style="color:black;"></i> Crystal 本体のコード
<a href="https://github.com/crystal-lang/crystal/blob/9bb0ada8cf0d77d6b3dd17c99ff92bea32083325/src/spec/expectations.cr#L153-L168" target="_blank">Spec::MatchExpectation - crystal-lang/crystal - GitHub</a>

#### <i class='fa fa-file-text'></i> 説明
実行結果が期待される正規表現にマッチするか判定します。

#### <i class='fa fa-flask'></i> サンプルコード
```crystal
require "spec"

describe "match" do
  it "match" do
    %w(hoge hige hage).sample.should match(/h.ge/)
  end

  it "not match" do
    %w(hoge hige hage).sample.should_not match(/h.ello/)
  end
end
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [DSL - Crystal API Doc](http://crystal-lang.org/api/Spec/DSL.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Expectations - Crystal API Doc](http://crystal-lang.org/api/Spec/Expectations.html)