rspec中的stub随机值,带有secure_random

Sin*_*ary 8 ruby unit-testing rubygems rspec ruby-on-rails

我正在尝试为我的gem编写规范,它生成otp并将其保存在db中.现在我正在为它编写规范.所以基本上我有三个方法generate_otp!,regenerate_otp!,verify_otp(otp).是什么generate_otp!做的是它调用的方法generate_otp包含三个变量

  1. otp_code - 基本上是使用secure_random生成的随机值
  2. otp_verified - 一个布尔值,用于设置是否验证otp的状态
  3. otp_expiry_time - 设置otp的到期时间,可由rails app在配置中设置.

这三个都是我的数据库的列.

现在generate_otp我调用了将值保存到db active_recordssave方法之后.

现在进行测试我正在使用: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
Run Code Online (Sandbox Code Playgroud)

对此有何帮助?我也检查了这个问题,但没有多大帮助.这是我第一次编写规范,并且对rspecs没有那么多经验.我还研究了mock和stub 的官方文档,但我真的很困惑.

更新: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
Run Code Online (Sandbox Code Playgroud)

Tom*_*ord 13

剔除该SecureRandom方法的直接方法rspec如下:

before { allow(SecureRandom).to receive(:hex).with(4).and_return('abcd1234') }
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查'abcd1234'存储在数据库中的内容.为了保持测试DRY,您可能还希望将其作为变量引用,例如let(:random_value) { 'abcd1234' }.