javascript - 如何在 Mocha 测试中要求命名空间模型?

标签 javascript node.js backbone.js mocha.js chai

我有一个复杂的结构化主干应用程序,尚未经过测试。

我选择了 Mocha+Chai 作为测试套件,但在包含一些模块时遇到了问题。

所有模型的命名空间为,

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

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

模型命名空间本身声明为

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

当我尝试编写一个简单的测试时,例如

'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({
^

ReferenceError: Model is not defined

添加的,

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

Service 声明之前,但这次得到了

var GLOBAL = window;
             ^

ReferenceError: window is not defined

我其实对javascript mvc结构、node模块包含等并不熟悉,真的不知道如何深入。

目录结构(如果需要)

$ 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

最佳答案

您的测试环境设置正确吗?我有一个单独的目录用于测试:

├── 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 来运行测试。还要检查所有相对路径是否正确。

关于javascript - 如何在 Mocha 测试中要求命名空间模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41844967/

相关文章:

backbone.js - 使用 Express.js 和 Backbone.js 设置默认路由

javascript - 将 Backbone.js 集合导出到硬盘上的纯文本并导回

javascript - 如何找出 JavaScript Promise 中返回的类型

javascript - 使用 ReactDOM.render 渲染元素时如何访问 redux 存储?

javascript - 我们需要在 JavaScript 中使用 “unset” 变量吗?

javascript - 如何使用 Node Express JS 获取完整的 url 并发送到其他 js 页面

javascript - Meteor 方法回调何时触发?

android - React Native on Android : Cannot run program "node": error=2, 没有这样的文件或目录

node.js - Elasticsearch批量API发布请求中的NewLine错误

javascript - 在 Backbone 中绑定(bind)时防止函数被调用两次?