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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

8282閲覧

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

hitomatagi

総合スコア37

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/06/12 05:04

編集2016/06/12 05:15

実現したいこと

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

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

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

JavaScript

1var foo = function(str) { 2 if(str == null) { 3 console.log("str is null"); 4 } 5 else { 6 console.log(str); 7 } 8}

その他

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

JavaScript

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

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

ご参考になれば。

投稿2016/06/12 08:58

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hitomatagi

2016/06/15 14: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); ```
guest

0

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

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

javascript

1var sinon = require('sinon'); 2 3var foo = function(str, opts) { 4 opts = opts || {}; 5 opts.log = opts.log || console.log.bind(console); 6 7 if(str == null) { 8 opts.log("str is null"); 9 } 10 else { 11 opts.log(str); 12 } 13} 14 15var log = sinon.spy(); 16foo('test', {log: log}); 17console.log(log.args[0]); // test

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

参考

投稿2016/06/12 05:36

編集2016/06/12 05:39
horse_n_deer

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hitomatagi

2016/06/15 14:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問