2017-01-25 2 views
0

Ich habe eine komplex strukturierte Backbone-Anwendung, die noch nicht getestet ist.Wie werden Namespace-Modelle im Mocha-Test benötigt?

Ich habe Mocha + Chai als Testing Suite gewählt, sehe aber Probleme mit einigen Modulen.

Alle Modelle sind,

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

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

Modell Namensraum selbst als

erklärt

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

Als ich versuchte, einen einfachen Test wie

'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; 
     }); 
    }); 

zu schreiben Es warf Fehler,

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

ReferenceError: Model is not defined 

Der zusätzliche,

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

vor Service Erklärung, aber diesmal bekam

var GLOBAL = window; 
      ^

ReferenceError: window is not defined 

Ich bin eigentlich nicht vertraut mit Javascript-mvc Struktur, Knotenmodul Inklusion usw. und wirklich nicht tun wissen, wie man graben.

Verzeichnisstruktur bei Bedarf

$ 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 

Antwort

0

Haben Sie Ihre Testumgebung richtig eingerichtet? Ich habe ein separates Verzeichnis für meine Tests:

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

Dann wird in der test.html, Sie sind Ihre Abhängigkeiten

... 
    <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> 

Dann schreiben Sie Ihre Tests in der [yourModel] .spec.js Datei so was. In diesem Beispiel ist es 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; 
    }); 
}); 

Dann öffnen Sie Ihren Browser und öffnen test.html Ihre Tests auszuführen. Überprüfen Sie auch, ob alle relativen Pfade korrekt sind.

+0

Ich führe Tests am Terminal durch. Lass mich dein letztes Stück probieren. – marmeladze

1

Das Problem, das Sie haben, besteht darin, dass Sie versuchen, Code auszuführen, der den globalen Bereich window in einer Umgebung ohne globalen Speicherbereich mit dem Namen window benötigt. Im Knoten ist der globale Speicherplatz global. Zumindest würden Sie so etwas wie dies benötigen:

var GLOBAL = typeof window !== "undefined" ? window : global; 

würde ich den ganzen Kram in einem IIFE setzen. Andernfalls definieren Sie eine Variable mit dem Namen GLOBAL für den globalen Speicherbereich. Also:

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

Dies wird Ihre unmittelbare Hürde zu lösen. Je nachdem, welche Art von Test Sie ausführen, benötigen Sie möglicherweise eine window, die so nah wie möglich an einem tatsächlichen DOM Window Objekt ist. Wenn ja, können Sie JSDom verwenden. Es gibt Dutzende von Fragen darüber, wie man es auf SO verwenden kann. Ich habe im Laufe der Jahre tausende von Tests durchgeführt. Mein Rat ist, JSDom nur zu benutzen, wenn Sie es wirklich brauchen.Versteh mich nicht falsch, JSDom ist großartig und absolut notwendig für einige Tests, aber es hat Overhead.

Verwandte Themen