在測試時會因為需要經過一些 Service
、Worker
、第三方服務導致真的去運行,進而讓測試速度變慢,如果這些 Service
、 Worker
、第三方服務不是當下這個測試的重點我們可以選擇將他 mock
或 stub
起來,直接回傳指定的值會讓測試更快!
我的理解就是stub
能夠⽤在任意的物件及類別上,假造回傳值或是可以造假方法
describe 'create user' do
let(:user) { create(:user) }
it 'when user name is ck' do
expect(user).to receive(:name).and_return('ck') # 指定 factory 建出來的 user name 回傳 'ck'
allow_any_instance_of(User).to receive(:name).and_return('ck') # 可以使所有User instance 的 name 都會回傳 'ck'
expect(user.name).to eq('ck')
end
end
而mock
其實與stub
相似,不同於如果沒有被呼叫到就會測試失敗
describe 'create user' do
let(:user) { create(:user) }
it 'when user mock' do
expect(user).to receive(:change_name).and_return(false)
expect(user.hi('ck2')).to eq(false)
end
end
如果行為沒發生,一定會失敗
Failures:
1) User count user when user mock
Failure/Error: expect(user).to receive(:change_name).and_return(false)
(#<User id: 1, created_at: "2021-09-12 13:38:16.455782000 +0000", updated_at: "2021-09-12 13:38:16.455782000 +0000", name: "ck-2", email: "ck-2@gmail.com", phone: nil, shop_id: nil>).change_name(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
明天會來講解 cucumber 的基本寫法,未來會在更新前片幾篇的篇幅,畢竟都是臨時趕出來的...會想辦法寫得更加完整!
參考來源:
ihower介紹rpsec-mock
必看!裡面也有介紹到一些關於 mock stub 該如何正確使用~