我正在爲我的gem編寫specs,它會生成otp並將其保存在db中。現在我正在爲它寫規格。所以基本上我有三種方法generate_otp!
,regenerate_otp!
,verify_otp(otp)
。什麼generate_otp!
所做的就是調用一個方法generate_otp
它包含三個變量rspec中的stub隨機值與secure_random
otp_code
- 基本上都採用secure_randomotp_verified
生成的隨機值 - 布爾值設置狀態OTP是否被驗證或不otp_expiry_time
- 設置otp的失效時間,可以通過配置中的Rails應用設置。
這三個都是我db的列。
現在在generate_otp
之後,我打電話給active_records
的save
方法將值保存到db。
現在進行測試,我在:memory:
中使用並將值存儲在表中。經過測試,我放棄了數據庫。現在我不知道如何將隨機生成的值存根並測試值是否分配給所有三列,即otp_code
,otp_verified
,otp_expiry_time
。
這是我需要測試的方法的代碼。
def generate_otp
self.otp_verified = false
self.otp_expiry_time = OtpGenerator::configuration.otp_expiry_time
self.otp_code = SecureRandom.hex(4)
end
def generate_otp!
generate_otp
save
end
任何幫助?我也檢查過這question,但沒有太大的幫助。這是我第一次編寫規範,並且真的沒有那麼多rspecs的經驗。我也研究了模擬和存根的官方documentation,但我真的很困惑。
更新:otp_spec代碼
require 'spec_helper'
describe OtpGenerator do
let(:user) { build_mock_class.new() }
before(:all) { create_table }
after(:all) { drop_table }
describe '#generate_otp' do
it 'generate otp and save it' do
user.generate_otp!
end
end
describe '#regenerate_otp' do
it 'regenerate otp and save it' do
end
end
describe '#verify_otp' do
it 'verifies otp' do
end
end
def build_mock_class
Class.new(ActiveRecord::Base) do
self.table_name = 'mock_table'
include OtpGenerator
end
end
def create_table
ActiveRecord::Base.connection.create_table :mock_table do |t|
t.string :otp_code
t.boolean :otp_verified
t.datetime :otp_expiry_time
end
end
def drop_table
ActiveRecord::Base.connection.drop_table :mock_table
end
end
如果你正在學習一種不同的方法來存儲方法,鏈接的問題和答案就沒有多大意義。每個測試庫(和RSpec版本)的方法存根語法略有不同,因此請注意,您不會在互聯網上找到的示例之間混淆。你問題中的大部分細節(包括想要存根一個隨機數生成器的方法的事實)都是不相關的。您能否通過單個RSpec測試來顯示您的位置,以及您從文檔中究竟陷入了哪些困境?此外,選擇您想要聲明的示例行爲真的很關鍵。 –
實際上這就是問題所在,我沒有得到如何存根,並驗證該值存儲在數據庫中並分配給otp_code列。我在這裏感到困惑。 – Sinscary
顯示你到目前爲止的內容,並且非常重要的是展示你想要測試的內容。 –