使用Marionette.CompositeView进行单元测试

时间:2012-08-14 09:24:32

标签: javascript backbone.js jasmine marionette

使用jasmine,我正在尝试测试一个返回Marionette.CompositeView的javascript模块。

这是javascript模块(2)和javascript单元测试(1)。

我的问题是如何从(1)访问渲染视图?
有关详细信息,请参阅代码注释。

P.S .:
1)javascript模块可以生成正确的渲染视图 2)当我运行测试时,javascript控制台给出了以下错误:backbone.marionette.min.js:9

Uncaught NoTemplateError: Could not find template: 'function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }' 

3)因为我正在使用handlebars,所以我用这种方式重新编写了Marionette.Renderer.render

enter code here
define([
    'marionette'
], function (Marionette) {
    Marionette.Renderer.render = function (template, data) {
        return template(data);
    };
});

(1)

(function () {
    'use strict';
    define([
        // some code
    ], function (MyView) {
        describe('Layout App - Header View ', function () {
            beforeEach(function () {
                this.view = new MyView({
                    currentUser: new Backbone.Model()
                });
            });

            describe('Instantiation', function () {
                it('should create a div element', function () {
                    expect(this.view.el.nodeName).toEqual('DIV'); // it works
                });

            });

            describe("Rendering", function () {

                it("returns the view object", function () {
                    console.log(this.view.render()); // undefined // why?
                    expect(this.view.render()).toEqual(this.view); // it fails
                });
            });
        });
    });
});

(2)

define([
    // some code
], function (myTemplate, MyItemView) {
    return Marionette.CompositeView.extend({
        template: myTemplate,
        itemView: MyItemView,
        // some code
    });

});

2 个答案:

答案 0 :(得分:1)

在其上调用render方法,就像使用任何其他骨干视图一样


            beforeEach(function () {
                this.view = new MyView({
                    currentUser: new Backbone.Model()
                });

                // render it
                this.view.render();
            });

答案 1 :(得分:0)

实际上,render方法会返回undefined。而不是expect(this.view.render()),你应该做类似

的事情

this.view.render(); expect(this.view.$el.find('.class_in_template').length).to.be.greaterThan(0);