テスト環境でのsaveについて

このQ&Aのポイント
  • テスト環境でのsaveコマンドを実行すると、newしたuserの内容ではなく、fixturesフォルダの下のテストデータの内容が書き込まれます。
  • YMLデータではなく、別のデータを書き込む方法はありますか?
  • モデルのpasswordセッターメソッドを再定義しているにもかかわらず、YMLデータが暗号化されずにそのまま入力されてしまいます。このメソッドの呼び出しは、テーブルの内容またはYMLデータの書き込み時に実行されるのでしょうか?
回答を見る
  • ベストアンサー

テスト環境でのsaveについて

Ruby1.9.3とRails3.2.9でのテスト環境のモデルの単体テスト(unit)での質問です。 unitのuser_test.rb に下記の記述を書いて試験しているのですが、saveコマンドでのusersテーブル への書き込みが、下記でnewしたuserの内容ではなく、fixturesフォルダの下の、users.ymlのテストデータの内容が書き込まれるようなのですが、動作はそれでよいのでしょうか?また、YMLデータではなくて下記のデータを書き込ませるsaveの書き方とかはあるのでしょうか? test "user auth test" do user = User.new(:name => "tanaka", :password => "pass", :password_confirmation => "pass") user.save assert User.auth("tanaka", "pass") end 後、現在、usersテーブルのhashed_passwordフィールドに、モデル(user.rb)の中で、パスワードの セッターを再定義するために、 class User < ActiveRecord::Base   def password=(pwd)   @password = pwd    #   return if pwd.blank?   self.hashed_password = User.encrypt(@password)   end # 以下、省略 end の記述を入れているのですが、現在何故か、YMLのデータが暗号化されないでそのまま入力されてしまっていますま。このメソッドの呼び出しは、上に書いたusersテーブルの内容またはYMLデータの書き込み時に、実行されると思っていいのでしょうか?(両方、またはどちらか?) 御教示願えればと思います。

  • Ruby
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

>saveコマンドでのusersテーブルへの書き込みが、下記でnewしたuserの内容ではなく、fixturesフォルダの下の、users.ymlのテストデータの内容が書き込まれるようなのですが、動作はそれでよいのでしょうか?また、YMLデータではなくて下記のデータを書き込ませるsaveの書き方とかはあるのでしょうか? 回答: モデルの単体テスト(unit)実行時、まず、fixturesフォルダの下の、users.ymlがテスト用DBに書き込まれます。次に、テスト用スクリプトのsaveで実行した内容が、書き込まれます。 但し、test "user auth test" do が完了した時点で、saveで書き込んだ内容は、消滅します。 (次のテストは、fixturesフォルダの下の、users.ymlのデータ読み込んだ状態で、開始します) 従って、実際には、saveで実行した内容はテストDBに書き込まれます。 >後、現在、usersテーブルのhashed_passwordフィールドに、モデル(user.rb)の中で、パスワードのセッターを再定義するために、・・・・の記述を入れているのですが、現在何故か、YMLのデータが暗号化されないでそのまま入力されてしまっていますま。このメソッドの呼び出しは、上に書いたusersテーブルの内容またはYMLデータの書き込み時に、実行されると思っていいのでしょうか? 回答: user = User.new(:name => "tanaka", :password => "pass", :password_confirmation => "pass") を実行したタイミングで実施されているはすです。但し、saveで実行した結果が消滅するために、実施されていないように見えるだけです。 以下、確認用のソースと実行結果です。(User.cryptは入力文字の後に:cryptを付加した文字を返す形で実装しています) test/fixtures/users.yml -------------------------------- # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html one: name: MyName1 password: MyPass1 password_confirmation: MyPass1 hashed_password: MyPass1_hash two: name: MyName2 password: MyPass2 password_confirmation: MyPass2 hashed_password: MyPass2_hash ----------------------------------------- test/unit/user_test.rb -------------------------------------------- require 'test_helper' class UserTest < ActiveSupport::TestCase test "user auth test" do users = User.all p "====user auth test_before===" users.each do |user| p user.name p user.hashed_password end user = User.new(:name => "tanaka", :password => "pass", :password_confirmation => "pass" ) assert user.save, 'Failure1 to save user!' users = User.all p "====user auth test_after====" users.each do |user| p user.name p user.hashed_password end assert true, 'Error auth test' end test "user get test" do user = User.new(:name => "AAAAA", :password => "BBBB", :password_confirmation => "BBBB" ) assert user.save, 'Failure2 to save user!' users = User.all p "===user get test_after===" users.each do |user| p user.name p user.hashed_password end assert true, 'Error Success to get' end end ----------------------------------------------- models/user.rb ----------------------------------------- class User < ActiveRecord::Base attr_accessible :hashed_password, :name, :password, :password_confirmation def User.encrypt(pwd) return pwd + ':encrypt' end def password=(pwd) @password = pwd return if pwd.blank? self.hashed_password = User.encrypt(@password) end end ---------------------------------------------- 実行コマンド rake db:test:load rake test:units TEST="test/unit/user_test.rb" 実行結果 --------------------------------------------------- # Running tests: "====user auth test_before===" "MyName2" "MyPass2_hash" "MyName1" "MyPass1_hash" "====user auth test_after====" "MyName2" "MyPass2_hash" "MyName1" "MyPass1_hash" "tanaka" "pass:encrypt" ."===user get test_after===" "MyName2" "MyPass2_hash" "MyName1" "MyPass1_hash" "AAAAA" "BBBB:encrypt" . Finished tests in 0.486803s, 4.1084 tests/s, 8.2169 assertions/s. 2 tests, 4 assertions, 0 failures, 0 errors, 0 skips ------------------------------------------------------ 半角空白で投稿のため、インデントがずれています。

tmiyoshi
質問者

お礼

情報ありがとうございます。 unitテストでのsaveの動作、理解できました。 データが暗号化されない件は解決致しました。 ありがとうございました。

関連するQ&A

  • PASSWORD関数

    INSERT INTO user_table(id,pass) VALUES ('abc',PASSWORD('123'); で入力したデータを以下のSELECT文で抽出しようとした処、クエリー発行は成功するものの、結果行数(mysql_num_rows)が0となります。 SELECT * FROM user_table WHERE pass=PASSWORD('123'); どうぞご教授ください。

    • ベストアンサー
    • MySQL
  • Ruby 暗号化したファイルの復号について

    Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、 質問させていただきます。 Ruby 1.9.3を使用しています。 ・ファイルの暗号化 encrypt.rb ------------------------------------------------- # encoding: cp932 require 'openssl' def encrypt(file, pass)   enc = OpenSSL::Cipher::AES256.new('CBC')   enc.encrypt   enc.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.sec", 'wb') do |fout|       while buff = fin.read(8000)         fout.write(enc.update(buff))       end       fout.write(enc.final)     end   end   enc.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       encrypt(arg, pass)       puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"     rescue       puts "#{arg}の暗号化に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- ・ファイルの復号 decrypt.rb ------------------------------------------------- # encoding: cp932 def decrypt(file, pass)   dec = OpenSSL::Cipher::AES256.new('CBC')   dec.decrypt   dec.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.plain", 'wb') do |fout|       while buff = fin.read(512)         fout.write(dec.update(buff))       end       fout.write(dec.final)     end   end   dec.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       decrypt(arg, pass)       puts "#{arg}を復号したファイル#{arg}.plainを作りました。"     rescue       puts "#{arg}の復号に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、 decrypt.rbを実行してパスワードを入力しても復号ができません。 どのようにすれば復号できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • cgiでのユーザーIDとパスワードの認証

    パスワードの確認しかないcgiにユーザーIDの認証も追加したいのですが、どのように変更すれば良いのかわかりません。皆さんのアドバイスよろしくお願いします。 ※ユーザーID $text = 'test' # パスワードの確認 if ($formdata{'pass'} eq $password or $cookies{'pass'} eq $password) { $access = $upload = $delete = 1; $cookie = "Set-cookie: pass=$password\n"; } elsif ($formdata{'pass'} or $cookies{'pass'}) { $form_log .= "パスワードが正しくありません。<br>"; }

  • delete構文のつなげなんですが・・・

    最近システムに飛ばされ毎日、悪戦苦闘の超初心者ですが宜しくお願い致します。 mysqlのtestテーブルに以下のデータが入ってるとします。 +----------+----------+-----+ | user | password | uid | +----------+----------+-----+ | test1 | test | 501 | | test2 | test | 502 | | test3 | test | 503 | | test4 | test | 556 | | test5 | test | 506 | userレコードのtest1~test3を削除していこうと思うのですが、一文で終わらそうと思い、 delete from users where user='test1','test2','test3'; とやったのですが怒られてしまいました。 複数を削除する場合は、どのように繋げていけばよいのでしょうか? 調べても、いまいちわからなかっので、何卒ご教授願えればと思います。 それとテーブル作成の方法でわかりやすいサイトなどをご存知でしたらお教え願えればと思います。 ※テーブル作成もいまいちわかりません。。。

    • ベストアンサー
    • MySQL
  • HTTPのBASIC認証につきまして。

    こんにちは、kanpoと申します。 PHPマニュアルに以下のような記述があったのですが 下記について質問させてください。 manual start======================================================= Example 2-1. HTTP 認証の例 <?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "ユーザーがキャンセルボタンを押した場合に送られるテキスト\n"; exit; } else { echo "こんにちは $PHP_AUTH_USER.<P>"; echo "あなたは、パスワードとして $PHP_AUTH_PW を入力しました。<P>"; } ?> 単に $PHP_AUTH_USER、$PHP_AUTH_PW を出力するのではなく、 ユーザー名とパスワードの有効性をチェックしたいと思うかもしれません。 その場合、クエリーをデータベースに送るか、ある dbm ファイル中の ユーザーを調べるといったことをすることになるでしょう。 manual end========================================================= この、”クエリーをデータベースに送るか”というところなんですが これはUID&PASSをDBに登録されている情報と照合をかけるという意味だと思うのですが、ポップアップWindowで入力されたUID&PASSを.htaccessにかかれたUID&PASSで認証しそのUID&PASSをDBによりもう一度照合するということでしょうか? それとも、ポップアップで入力してもらったUID&PASSをそのままDBにて認証できるのでしょうか? よろしくご教授ください。

    • ベストアンサー
    • PHP
  • PHP+mySQL認証画面

    サーバーの引っ越しで新しいサーバーにてプログラムの動作確認を行っています。 管理者パネルに入るのに、PHPで作成した認証プログラムでログインしようとすると、入力しても何度も聞いてきて入れません。 旧 MySQL5.0.22   phpMyAdmin2.8.2.4 新 MySQL5.1.69 phpMyAdmin3.5.8.1  IDとパスワードはデータベースで設定。 管理者パネルで変更できるようになっている。 $sv = "**"; $dbname = "**"; $user = "**"; $pass = "**"; ログイン認証 //データベースに接続する $conn = mysql_connect($sv,$user,$pass) or die("接続エラー"); mysql_select_db($dbname) or die("データーベース接続エラー"); $sql = "SELECT id, pass FROM pass_t WHERE pno=1"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $db_user_id=$row['id']; $db_password=$row['pass']; } if(!isset($_SERVER["PHP_AUTH_USER"]) || $_SERVER["PHP_AUTH_USER"] != "$db_user_id" || $_SERVER["PHP_AUTH_PW"] != "$db_password") { header("WWW-Authenticate: Basic realm=\"login\""); header('HTTP/1.0 401 Unauthorized'); echo "ユーザー名またはパスワードが間違っています。<br>"; echo "もう一度はじめからやり直してください。"; exit; } 細々変えて試してみましたが駄目でした。 まだまだわからないことだらけの初心者なので、どうにもならずで 解決策がありましたらぜひ教えて頂けますと幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • IDとパスワードを認証すコードをかきましたが動きません

    phpの超初心者です、よろしくお願いします。 IDとパスワードを認証すコードをかきましたが動きません。 Formから別に使ったdbにあるIDとパスを見に行くコードでが、 dbにあるIDとパスと同じものを打ち込んでも認証しません、 また別のdbにあるIDとパスを打ち込んでも認証するときがあります。 一体どこが悪いのでしょうか。どこが悪いのかさっぱり分かりません。 よろしくお願いします。 --------------------------------------- <?php $conn = mysql_connect(localhost, "root", ""); //DBにコネクト mysql_select_db('login_test', $conn); //'login_test'をselect mysql_query('SET NAMES utf8'); //defalt $res_init=mysql_query('SELECT * from user'); //userからすべてのdataを取得 while($arr = mysql_fetch_assoc($res_init)){ //結果セットが無くなるまでループ foreach($arr as $k => $v){ echo "フィールド ".$k." の値は ".$v; echo "<br />"; } echo "<br />"; } //formからDATAを取得 $id=$_POST['input_ID']; $pass=$_POST['input_pass']; print("入力したid= ".$id." 入力したpass= ".$pass); //認証check if(auth ($id,$pass,$conn)===true){ print("認証成功"); } else{ print("認証不成功"); } //function function auth ($id,$pass,$conn){ $sql = "SELECT * from user WHERE user_id = $id AND password = '$pass'"; $res = mysql_query($sql, $conn); return $res; } ?> <form action="http://localhost/test/test.php" method="POST"> IDの入力:<input type="text" name="input_ID"><br /><br /> Passの入力:<input type="text" name="input_pass"><br /><br /> <input type="submit" name="delete_submit" value="送信"><br /> </form> </body> </html>

    • ベストアンサー
    • PHP
  • PEAR auth で認証ができません

    PHP初心者で、PEAR Authによるsqliteを使用して認証のテストを行っています。 コード: <?php require_once "Auth.php"; function loginFunction() { echo "<form method=\"post\" action=\"test_auth.php\">"; echo "<input type=\"text\" name=\"username\">"; echo "<input type=\"password\" name=\"password\">"; echo "<input type=\"submit\">"; echo "</form>"; } $dsn = array( 'phptype' => 'sqlite', 'database' => 'test.sqlite', 'mode'=>'0644' ); $options = array( 'dsn' => $dsn, 'table'=>"schedule_usr", 'usernamecol'=>"username", 'passwordcol'=>"password" ); $a = new Auth("DB", $options, "loginFunction"); $a->start(); if ($a->checkAuth()) { print("認証しました。"); }else{ print("認証していません。")); } ?> エラーなどは表示されませんが、「認証しました」が表示されません。 test.sqliteではschedule_usrテーブルに username=test password=1111を 入力してあります。パスワードはmd5()で変換したものを入れてありますが、 「認証していません」が表示されてしまいます。 コード自体に問題があるのでしょうか? ご教示願います。

    • ベストアンサー
    • PHP
  • 結合について

    ●mng_usr          liginid | password ------------------ ●user loginid | name ----------------- 以上のようにmng_usrテーブルにはloginid・password userテーブルにはloginid・nameがあります。 この時にmng_usrのloginid=userのloginidの場合にuserテーブルのデータ(name)を取得するにはどうしたらよいのでしょうか??

  • SQLの条件抽出について

    ちょっと躓いてしまったのでアドバイスが頂けたらと思います。 user_accountというテーブルと、logというテーブルがあります。 logというテーブルには各ユーザーの書き込み履歴が残されており、日付がtimestamp形式で格納されています。 ユーザー一覧に最終発言内容をくっ付けて表示したいのですがうまくいきません。 SELECT DISTINCT * FROM user_accounts LEFT JOIN (SELECT * FROM log ORDER BY update_date DESC ) aaa ON user_accounts.pkey = aaa.user_accounts_pkey; などと記述してみましたが、思うような結果になりません。 自分の理想とする結果は以下のような出力結果です。 +----+----+----+--+-----------------+----------------+-----------+ | pkey| user| pass|      comment| update_date| +----+----+----+--+-----------------+----------------+-----------+ |  1 | test1| pass01|test03 written by test1| 40813| |  2 | test2| pass02|testestest        | 40690| どうか、お知恵を貸してください。

専門家に質問してみよう