質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

console.log()の出力をUnitTestで検証したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,419

hitomatagi

score 37

 実現したいこと

JavaScript初心者です。普段は、Javaを使ています。
JavaScriptでUnitTestをやろうとしています。

環境は、Node.jsとMochaを使っています。
すでに簡単なUnitTestはできています。

下記のようなコードに対して、strに応じてコンソール出力が切り替わることをassertするテストを書きたいです。

var foo = function(str) {
  if(str == null) {
    console.log("str is null");
  }
  else {
    console.log(str);
  }
}

 その他

普段使っている、Javaであれば、コードを修正する、モックライブラリーを使う、出力を変更するなど、色々な解決策が思い浮かびますが、JavaScriptは初心者なので、この先、どの方向に進めばよいのか判断できずにいます。

幅広いご意見を、お待ちしております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

コンソールに出力されたテキストに後からアクセスする方法はありません。
このような場合、console.log() をカスタムコードで上書きしてテキストを横取りできるようにするのが一般的な方法ではないでしょうか。

/* console.log() を保存 */
var original_console_log = console.log;
/* console.log() をカスタム関数で上書き */
console.log = function(message) {
  /* ここでmessageを好きなように処理する */
  do_something(message);
  /* 最後に元の console.log() を呼び出す */
  original_console_log(message);
};

今回、出力された文字列が変化するかどうかを検証したいのですから、do_something() の部分で必要な検証を行うようにすればよろしいかと思われます。

ご参考になれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/15 23:15

    教えていただいた方法をもとにテストを書いてみたところ、うまくいきました。
    console.logを別の変数に一旦保存しておき、後で元に戻すのがポイントでした。

    JavaScriptらしい方法で、簡潔だったので、ベストアンサーを押させていただきます。
    ありがとうございました。

    ```JavaScript
    const assert = require('assert');

    //-----------------
    // 対象コード
    const foo = function(str) {
    if(str == null) {
    console.log("str is null");
    }
    else {
    console.log(str);
    }
    }

    //------------------
    // テスト

    var log = [];

    // 最初の状態を保存
    var original_console_log = console.log;
    console.log = function(message) {
    log[log.length] = message;
    };

    const msg1 = null;
    foo(msg1);

    const msg2 = "abc";
    foo(msg2);

    // 最初の状態に戻す
    console.log = original_console_log;

    const exp1 = "str is null";
    assert.equal(log[0], exp1);

    const exp2 = "abc";
    assert.equal(log[1], exp2);
    ```

    キャンセル

+1

関数の第二引数(必須引数の後)には、オプション引数をオブジェクト{}を渡せるのが一般的なメソッドの実装方法ですが、ここにモック用のプロパティを用意するのが簡単な解決方法です。モックとしてsinonを使用します。

下記の例では、第二引数にモック{log}を与え、実行された際の引数を確認するものです。

var sinon = require('sinon');

var foo = function(str, opts) {
  opts = opts || {};
  opts.log = opts.log || console.log.bind(console);

  if(str == null) {
    opts.log("str is null");
  }
  else {
    opts.log(str);
  }
}

var log = sinon.spy();
foo('test', {log: log});
console.log(log.args[0]); // test

他の方法としてはchild_process.execを利用することでしょうか。

参考

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/15 23:18

    ご回答ありがとうございました。
    sinonやオプション引数の使い方が勉強になりました。
    今後とも、よろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る