rspec 筆記

c3tc3tc3t發表於2018-02-16

rspec的expect方法接收任何物件作為引數,並且返回一個rspec代理物件 叫做 ExpectationTarget。

ExpectationTarget儲存了傳遞給expect方法的物件,他響應兩個方法to和not_to (從技術上來說是三個, to_not是一個別名), to和not_to是普通的ruby方法,期望接收一個rspec matcher作為引數
rspe matcher沒有什麼特別的,僅僅是可以響應matchers?方法的物件, 你可以使用預定義的matchers或者自己定義

在我們的例子 expect(project.done?).to be_truthy 中, be_truthy是一個方法,rspec定義的,返回BeTruthy匹配器,和下面行為一樣

expect(project.done?).to(RSpec::BuiltIn::BeTruthy.new)

ExpectationTarget現在儲存兩個物件 , 一個是被匹配的物件 project.done?和matchert叫做be_truthy。 當spec執行時, rspec在matcher呼叫 matches?使用使用這個Project.done?作為matcher的引數, 如果使用to, 這個maches?接收引數執行後,返回true就是通過測試, 如果使用not_to,檢查matcher中有沒有does_not_match?方法, 如果沒有這個方法,就回頭看maches?返回false表示測試通過

形式如be_whatever或者be_a_whatever關聯了一個whatever?方法, 有一個問號標記在真實物件上,在我們前面的例子,expect(project.done?).to be_truthy 因為done?是一個斷言方法,我們可以將這個例子寫成, expect(project).to be_done

If the matcher is called via to , it passes if the predicate method returns a true value. If the matcher is called via not_to , it passes if the predicate method returns a false value.

if the predicate method starts with has , RSpec allows your matcher to start with have for readability (so your tests don’t look like they’ve been written by LOLCats); RSpec allows expect(actual).to have_key(:id) rather than expect(actual).to has_key(:id) .

RSpec 3 also allows you to chain multiple matchers using and and or , as in expect(actual).to include("a").and match(/.*3.*/) , or expect(actual).to eq(3).or eq(5) .