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包含三个变量
otp_code - 基本上是使用secure_random生成的随机值otp_verified - 一个布尔值,用于设置是否验证otp的状态otp_expiry_time - 设置otp的到期时间,可由rails app在配置中设置.这三个都是我的数据库的列.
现在generate_otp我调用了将值保存到db active_records的save方法之后.
现在进行测试我正在使用: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' }.
| 归档时间: |
|
| 查看次数: |
2183 次 |
| 最近记录: |