2016-07-14 55 views
1

我正在爲我的gem編寫specs,它會生成otp並將其保存在db中。現在我正在爲它寫規格。所以基本上我有三種方法generate_otp!regenerate_otp!verify_otp(otp)。什麼generate_otp!所做的就是調用一個方法generate_otp它包含三個變量rspec中的stub隨機值與secure_random

  1. otp_code - 基本上都採用secure_random
  2. otp_verified生成的隨機值 - 布爾值設置狀態OTP是否被驗證或不
  3. otp_expiry_time - 設置otp的失效時間,可以通過配置中的Rails應用設置。

這三個都是我db的列。

現在在generate_otp之後,我打電話給active_recordssave方法將值保存到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 
+0

如果你正在學習一種不同的方法來存儲方法,鏈接的問題和答案就沒有多大意義。每個測試庫(和RSpec版本)的方法存根語法略有不同,因此請注意,您不會在互聯網上找到的示例之間混淆。你問題中的大部分細節(包括想要存根一個隨機數生成器的方法的事實)都是不相關的。您能否通過單個RSpec測試來顯示您的位置,以及您從文檔中究竟陷入了哪些困境?此外,選擇您想要聲明的示例行爲真的很關鍵。 –

+0

實際上這就是問題所在,我沒有得到如何存根,並驗證該值存儲在數據庫中並分配給otp_code列。我在這裏感到困惑。 – Sinscary

+0

顯示你到目前爲止的內容,並且非常重要的是展示你想要測試的內容。 –

回答

2

直接的辦法在rspec磕碰出SecureRandom方法是如下:

before { allow(SecureRandom).to receive(:hex).with(4).and_return('abcd1234') } 

然後,您可以檢查'abcd1234'被存儲在數據庫中。爲了保持DRY測試,您可能還希望將其作爲變量進行引用,例如, let(:random_value) { 'abcd1234' }

+0

謝謝,我會試試看。 – Sinscary

+0

以及這個工作,謝謝 – Sinscary

+0

嘿,你能告訴我我們如何可以存根'[*('A'..'Z'),*('0'..'9')]。sample(8).join '此代碼 – Sinscary