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

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

新規登録して質問してみよう
ただいま回答率
85.36%
Karma

Karma(元Testacular)は、node.jsベースのJavaScriptテストランナー。AngularJSのテストフレームワークとして開発されたもので、クライアントサイドのJavaScriptコードのテストを容易に実行できます。

Node.js

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

JavaScript

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

Q&A

解決済

2回答

3719閲覧

Node.jsのファイル分割

IST

総合スコア14

Karma

Karma(元Testacular)は、node.jsベースのJavaScriptテストランナー。AngularJSのテストフレームワークとして開発されたもので、クライアントサイドのJavaScriptコードのテストを容易に実行できます。

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/10 16:36

概要

  • Node.jsのファイル分割について

実現したいこと

  • 以下のテストを合格に保ちながら

javascript

1var ClassA = require('../src/main'); 2 3describe('requireTest', function() { 4 it('methodC()を呼び出してOKが返ること', function() { 5 var method_CD = ClassA.space_B.method_CD; 6 expect(method_CD.methodC()).toBe('OK'); 7 }); 8});
  • 以下のメソッド2を別のファイルに切り出したい

javascript

1var ClassA = (function () { 2 function namespace(string) { //namespace関数 3 var object = this; 4 var levels = string.split('.'); 5 for (var i = 0, l = levels.length; i < l; i++) { 6 if (typeof object[levels[i]] === 'undefined') { 7 object[levels[i]] = {}; 8 } 9 object = object[levels[i]]; 10 } 11 return object; 12 } 13 return { 14 namespace: namespace 15 }; 16}()); 17module.exports = ClassA; 18 19//メソッド1 20(function () { //クラス名の追加、削除 21 var space_A = ClassA.namespace("space_A"); 22 function methodA() {} 23 function methodB() {} 24 space_A.methodA = methodA; 25 space_A.methodB = methodB; 26}()); 27 28//メソッド2 29(function () { 30 function methodC() { 31 return 'OK'; 32 } 33 function methodD() {} 34 ClassA.namespace("space_B").method_CD = { 35 methodC: methodC, 36 methodD: methodD 37 }; 38}());

つまづいている箇所

  • 以下の書き方で書き出した場合、

javascript

1var ClassA = require('./main.js'); 2 3(function () { 4 function methodC() { 5 return 'OK'; 6 } 7 function methodD() {} 8 ClassA.namespace("space_B").method_CD = { 9 methodC: methodC, 10 methodD: methodD 11 }; 12}());
  • undefinedとなり、テストが不合格になってしまう。

JSの初心者です。どなたか知見のある方、御指南いただけたら幸いです。

備考

  • テストツールはkarma, jasmine, webpackです。
  • (できれば)即時実行関数の形は保ちたいと考えています。

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

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

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

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

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

guest

回答2

0

自己解決

おっしゃる通り、webpack.config.jsの以下の箇所を削除したら動作しました。
ありがとうございます。

diff

1- entry: "./src/index.js",

投稿2018/05/11 11:22

IST

総合スコア14

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

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

0

たぶん正解はこの形です。(あえて断片的に書きます)

javascript

1require('./method2.js')(ClassA);

■追記
じゃあ正解書いちゃうと、こうです。
requireの部分補うと(function(foo){...})(foo)となり、これはjqueryプラグインとかでよく見るイディオムですね。

method2.js

javascript

1module.exports = function (ClassA) { 2 function methodC() { 3 return 'OK'; 4 } 5 function methodD() {} 6 ClassA.namespace("space_B").method_CD = { 7 methodC: methodC, 8 methodD: methodD 9 }; 10}

main.js

javascript

1var ClassA = (function () { 2 function namespace(string) { //namespace関数 3 var object = this; 4 var levels = string.split('.'); 5 for (var i = 0, l = levels.length; i < l; i++) { 6 if (typeof object[levels[i]] === 'undefined') { 7 object[levels[i]] = {}; 8 } object = object[levels[i]]; 9 } 10 return object; 11 } 12 return { 13 namespace: namespace 14 }; 15}()); 16module.exports = ClassA; 17 18//メソッド1 19(function () { //クラス名の追加、削除 20 var space_A = ClassA.namespace("space_A"); 21 function methodA() {} 22 function methodB() {} 23 space_A.methodA = methodA; 24 space_A.methodB = methodB; 25}()); 26 27//メソッド2 28require('./method2')(ClassA);

投稿2018/05/10 16:51

編集2018/05/10 17:22
set0gut1

総合スコア2413

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

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

IST

2018/05/10 16:56

ありがとうございます。 この書き方も試してみたのですが、undefinedで不合格になってしまいますm(__)m
set0gut1

2018/05/10 17:22

追記しました
IST

2018/05/11 00:22

ありがとうございます。 このようにするとテストで下記のエラーとなってしまうのです涙 ```text Module not found: Error: a dependency to an entry point is not allowed ```
set0gut1

2018/05/11 01:42

requireするjsファイルがkarmaのエントリポイントになってはいませんでしょうか。main.jsからmethod2.js(的な名前のファイル)をrequireするようにして、もしmethod2.jsがエントリポイントに含まれているなら外してください。
IST

2018/05/11 11:24

ありがとうございます。 おっしゃる通りでした。 ベストアンサーとさせていただきます。
set0gut1

2018/05/11 11:27

おめでとうございます!(自己解決になってますがw)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問