2017-01-25 8 views
0

私はまだテストされていない複雑な構造化バックボーンアプリケーションを持っています。Mochaテストで名前空間付きモデルを要求する方法は?

私はテストスイートとしてMocha + Chaiを選択しましたが、いくつかのモジュールを含めるには問題があります。

すべてのモデル

が、私はそれがエラーを投げた

'use strict'; 
require ('mocha');  

var Service = require ('../../client/model/Service.js') 
var expect = require ('chai').expect; 

describe('Testing Service model', function(){ 
     it('should create global variable for Service', function(){ 
      expect(Service).to.be.exist; 
     }); 
    }); 

のような単純なテストを書くことを試みたときに

Model.Service = Backbone.Model.extend({ 
... 
... 

Model.Partner = Backbone.Model.extend({ 
... 
... 
etc. 

モデルの名前空間自体が

//global_vars.js 
var GLOBAL = window; 
... 
GLOBAL.Model   = {}; 

として宣言され、として名前空間されています

Model.Service = Backbone.Model.extend({ 
^ 

ReferenceError: Model is not defined 

追加、Service宣言の前に

require('../../client/global_vars.js'); 

が、今回は

var GLOBAL = window; 
      ^

ReferenceError: window is not defined 

が、私は本当にありません、実際にはJavaScriptのMVC構造、ノードモジュールを含めるなどに精通していないよとなりました掘り起こす方法を知る

必要に応じてディレクトリ構造

$ tree source/client/ 
source/client/ 
├── Application.js 
├── collection 
│   ├── I18n.js 
│   ├── Invoice.js 
│   └── Service.js 
├── controller 
│   ├── hardware 
│   │   └── Cash.js 
│   ├── Hardware.js 
│   ├── I18n.js 
│   ├── Remote.js 
│   └── ServiceManager.js 
├── draft.js 
├── global_vars.js 
├── lib 
│   ├── access_deep_object.js 
│   ├── backbone.validation.async.js 
│   ├── color_transition.js 
│   ├── dom_utils.js 
│   ├── error.js 
│   ├── jquery.form.serialize_object.js 
│   ├── number_utils.js 
│   ├── path.js 
│   ├── promise_core.js 
│   ├── remove_regexp_specials.js 
│   ├── stringTemplate.js 
│   ├── string_utils.js 
│   └── the_key.js 
├── model 
│   ├── Cacheable.js 
│   ├── Controller.js 
│   ├── Countdown.js 
│   ├── Device.js 
│   ├── hardware 
│   │   ├── BillAcceptor.js 
│   │   ├── CashDispenser.js 
│   │   ├── IDReader.js 
│   │   ├── SmartCoin.js 
│   │   └── ThermalPrinter.js 
│   ├── I18n.js 
│   ├── Invoice.js 
│   ├── Object.js 
│   ├── Partner.js 
│   ├── Performer.js 
│   ├── ServerSideEvent.js 
│   ├── Service.js 
│   ├── Session.js 
│   ├── Storage.js 
│   └── Transaction.js 
├── start.js 
├── template 
................ 
├── vars.js 
├── vendor 
................ 
└── view 
    ├── AppView.js 
    ├── Console.js 
    ├── ModalWindow.js 
    ├── page 
    │   ├── about.js 
    │   ├── articles 
    │   │   ├── list.js 
    │   │   └── tiles.js 
    │   ├── checkout 
    │   │   ├── card.js 
    │   │   └── cash.js 
    │   ├── custom 
    │   │   └── mobile_operator 
    │   │    ├── auth.js 
    │   │    └── packages.js 
    │   ├── exception 
    │   │   ├── connection.js 
    │   │   ├── dataloss.js 
    │   │   ├── emergency.js 
    │   │   └── transaction.js 
    │   ├── gallery.js 
    │   ├── input 
    │   │   ├── phone.js 
    │   │   └── text.js 
    │   ├── select 
    │   │   └── packages.js 
    │   ├── single_invoice.js 
    │   ├── start.js 
    │   ├── test 
    │   │   ├── hardware.js 
    │   │   └── payment.js 
    │   └── thankyou.js 
    ├── Page.js 
    ├── Prototype.js 
    └── Registration.js 

50 directories, 127 files 

答えて

0

テスト環境を正しく設定しましたか? 、そして、

├── Test 
| ├── js 
| | ├── spec 
| |  ├── myModel.spec.js 
| ├── test.html 

test.htmlという中で、あなたはあなたの依存関係

... 
    <head> 
     <meta charset="utf-8"> 
     <meta name="description" content=""> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <link rel="author" href="humans.txt"> 
     <link rel="stylesheet" href="../node_modules/mocha/mocha.css" /> 
    </head> 
    <body> 
     <div id="mocha"></div> 
     <!-- JavaScript Test Libraries --> 
     <script src="../node_modules/mocha/mocha.js"></script> 
     <script src="../node_modules/chai/chai.js"></script> 
     <script src="../node_modules/sinon/lib/sinon.js"></script> 
     <!-- JavaScript Core Libraries --> 
     <script src="../node_modules/underscore/underscore-min.js"></script> 
     <script src="../node_modules/jquery/dist/jquery.min.js"></script> 
     <script src="../node_modules/backbone/backbone-min.js"></script> 
     <!-- JavaScript Application Libraries --> 
     <script src="../app/js/namespace.js"></script> 
     <script src="../app/js/templates/templates.js"></script> 
     <script src="../app/js/models/myModel.js"></script> 
     <script src="../app/js/views/myView.js"></script> 
     <!-- set up mocha and chai --> 
     <script> 
      var expect = chai.expect; 
      mocha.setup('bdd'); 

      window.onload = function(){ 
       mocha.run(); 
      }; 
     </script> 

     <!-- include our specs --> 
     <script type="text/javascript" src="js/spec/namespace.spec.js"></script> 
     <script type="text/javascript" src="js/spec/myModel.spec.js"></script> 
     <script type="text/javascript" src="js/spec/myView.spec.js"></script> 

... 
<div id="mocha"></div> 
<div id="fixtures" style="display: none; visibility: hidden;"></div> 

が含まそして、あなたは[yourModel] .spec.jsファイルでテストを書く:私は私のテストのために別のディレクトリを持っていますこのような。この例では、myModel.spec.js

describe("App.Models.Station", function() { 
    it("Model creation is OK", function() { 
     var model = new App.Models.Station(); 
     expect(model).to.be.ok; 
    }); 
}); 

は、その後、あなたのテストを実行するには、ブラウザやオープンtest.htmlというを開いています。また、すべての相対パスが正しいことも確認してください。

+0

私は端末でテストを行っています。あなたの最後のスニペットを試してみましょう。 – marmeladze

1

問題は、windowという名前のグローバルスペースを持たない環境で、windowという名前のグローバルスペースが必要なコードを実行しようとしていることです。ノードでは、グローバルスペースはglobalです。少なくとも、あなたは次のようなものが必要です:

私はシバン全体をIIFEに入れます。それ以外の場合は、グローバルスペースが存在する場所にGLOBALという名前の変数を定義しています。したがって:

(function() { 
    var GLOBAL = typeof window !== "undefined" ? window : global; 
    GLOBAL.Model = {}; 
    // etc... 
}()); 

これは、あなたのすぐれた障害を解決します。これは、実行するテストのタイプによっては、実際のDOM Windowオブジェクトのできるだけ近くにwindowが必要な場合があります。その場合は、JSDomを使用することができます。それをSO上でどのように使用するかについては、数十もの質問があります。私は何年にもわたって何千ものテストを実行してきましたが、あなたが絶対に必要とする場合にのみJSDomを使用することがアドバイスです。私を間違えないでください.JSDomは素晴らしいテストです。いくつかのテストでは絶対に必要ですが、オーバーヘッドがあります。

関連する問題