2016-07-14 2 views
1

Я пытаюсь написать спецификации для моего драгоценного камня, который генерирует otp и сохраняет его в db. Теперь я пишу спецификации для этого. поэтому в основном у меня есть три метода: generate_otp!, regenerate_otp!, verify_otp(otp). то, что generate_otp! делает это вызывает метод generate_otp, который содержит три переменныеслучайное значение stub в rspec с secure_random

  1. otp_code - в основном случайное значение, генерируемое с помощью secure_random
  2. otp_verified - логическое значение, чтобы установить статус того, проверяется OTP или нет
  3. otp_expiry_time - устанавливает время истечения для otp, которое может быть установлено приложением rails в конфигурации.

все эти три столбца моего db также.

Теперь после generate_otp я звоню active_recordssave метод сохранения значений db.

Теперь для тестирования я использую в :memory: и сохраняю значения в таблице. после тестирования я удаляю db. Теперь я не получаю, как заглушить случайно сгенерированное значение и проверить, присвоено ли значение или нет всем трем столбцам, т. Е. 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, но не очень полезен. Впервые я пишу спецификации и на самом деле не так много имею опыт работы с rspec. Я также изучил официальный 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

Связанный вопрос и ответы не будут иметь большого смысла, если вы изучаете другой подход к методам stubbing. Каждая библиотека тестирования (и версии RSpec) имеет немного другой синтаксис для заглушек методов, поэтому будьте осторожны, чтобы вы не смешивали примеры, найденные вами в Интернете. Большинство деталей в вашем вопросе (включая тот факт, что вы хотите заглушить метод генератора случайных чисел) не имеют значения. Не могли бы вы показать, где вы находитесь с одним RSpec-тестом, и что именно вы застряли в документации? Кроме того, действительно важно выбрать пример поведения, который вы хотите утверждать. –

+0

На самом деле это то, что проблема, я не получаю, как заглушить, и проверить, что значение хранится в db и назначено столбцу otp_code. Я запутался здесь. – Sinscary

+0

Покажите то, что у вас есть, и очень важно показать, что вы хотите, чтобы ваш тест продемонстрировал. –

ответ

2

Прямой подход к гася метод SecureRandom в rspec будет выглядеть следующим образом:

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 'this code – Sinscary

Смежные вопросы