2017-09-09 2 views
0

を書く無効にするためのフレームワーク私はRailsのを使用してRailsの - テストメールを送信し、DBは

顧客のいくつかのタイプ(などなど管理者、マネージャー、マーケティング、)でウェブサイトを持って、私はそれらにテストメールを送信するように求めています人々は自分の電子メールクライアントで電子メールをプレビューできる+ファイアウォールの制限+電子メールがプロモーションフォルダに入るかどうかを確認する。私は、各ユーザのタイプに特定の電子メールを送ることができる必要があります(そのようなテストはまれですが、弊社の管理者のいずれかがフロントエンドインタフェースを使用してテスト電子メールを送信できるはずです)。

私は、ユーザタイプごとに1つのクラスを作成し、このユーザがある時点で受け取る可能性のある電子メールを登録し、ビルド専用モードではFactoryGirlなどを使用します(no DBに書き込み!!)deliver_nowを使用してメールを送信するために必要なモデルをビルドします(シリアル化/デシリアライズの問題は避けます)。私は実際の生産環境でこのシステムを稼働させることができるようになりました。(REAL電子メールの評判、署名などを使用できるように)

DB書き込みを簡単に無効にする方法はありますか?私の模範モデルは、使用後に電子メールを送信すると破棄されますか?)簡単なオプションは、読み取り専用データベースの資格情報を使用してサーバーを起動することですが、おそらくあまりにも多くの問題を回避する安全なものがあります。ここで

私は、私のFactoryGirls工場は非常に厄介であり、私は:buildメソッドを使用しておりますが、いくつかの工場がそのように念のため:create戦略との関連付けを使用して作成された

module Testing 
    module Emails 
    class UserTypeAdmin < Base 
     attr_accessor, :new_user, :admin 
     register_email :created_new_user, type: :user_management do 
     UserManagementMailer.user_created(new_user, creator: admin) 
     end 

     def prepare_models 
     self.admin = FactoryGirl.build(:admin) 
     self.new_user = FactoryGirl.build(:user) 
     end 
    end 
    end 
end 

module Testing 
    module Emails 
    class Base 
     class < self 
     # my logic to register emails, definitions of #register_email, etc. 
     end 

     def initialize(tester_emails, ccs = []) 
     @tester_emails = tester_emails 
     @ccs = ccs 
     prepare_models 
     end 

     def send_email(email_name) 
     email = instance_eval(registered_emails(email_name)) 
     email.to = @tester_emails 
     email.cc = @ccs 
     email.deliver_now 
     end 

のように私のコードがどのように見えるかですDBの書き込みをロックして、私のデータベース上の悪いノイズを簡単に防ぐことができます(私はMongoidを使用していますので、すべての書き込みをキャンセルする簡単なトランザクションメカニズムがありません)。

+0

:-)より良いソリューションに目を光らせて、まだです。私はこのようなことを生産中にすることに非常に注意します。ステージング環境として同じenvを使用して、利害関係者が新しい機能をプレビューできるようにすることができます。 – max

答えて

0

何もチェックしない仕様をDBに書き出します。これを使用して、1つのモデルが永続化されたいくつかのケースをデバッグすることができました。

require 'rails_helper' 

describe Testing::Email::UserTypeAdmin do 
    let(:tos) { ['[email protected]'] } 
    let(:ccs) { ['[email protected]'] } 
    let(:tested_models) {[ 
    User, Admin, 
    Conversation, Message, # etc. 
    ]} 

    subject do 
    described_class.new(tos, ccs) 
    end 

    context 'testing all emails' do 
    it 'does nothing with the DB' do 
     subject.send_all_emails 
     aggregate_failures 'no persistence' do 
     tested_models.each do |model| 
      expect(model.count).to eq(0), "#{model.name} was persisted" 
     end 
     end 
    end 
    end 
end 

私はあなたではなく、定期的に本番データベースを反映する別の環境を使用する場合があります

関連する問題