0

我有一个观点,他扩展了一个外部库(我们称之为 ExtLib),它也基于骨干木偶。基本上,这个库是共享行为的通用视图的包装器(例如,DetailsView、FormView 等)。所以,假设我有这样的事情:

MyApp.module('Views', function(Views, App, Backbone, Marionette, $, _) {

    Views.MyDetailsView = Marionette.ExtLib.DetailsView.extend({
        options: {
            fields: [
                // ...
            ],
            myFunction: function() {
                // ...
            }
        }
    });    
});

在我的 Jasmine 测试中,我调用了一个创建 MyDetailsView 实例的控制器方法。

it('does what it should', function() {
    // ...

    controller.showDetails();

    // my expectations
});

实际上,控制器中的方法只是创建视图并将其渲染(到布局的区域中)。

showDetails: function(story) {
    var container = new App.Layouts.DetailsLayout();
    var myDetailsView = new App.Views.MyDetailsView({
        model: story
    });

    container.details.show(storyDetailsView);
}

最后,这是我得到的错误:

TypeError: Cannot read property 'length' of undefined
at eval (eval at <anonymous> (http://localhost:8080/myapp/js/lib/underscore/underscore-min.js?_debugResources=y&n=1354890505115:30:350), <anonymous>:17:35)
at c (http://localhost:8080/myapp/js/lib/underscore/underscore-min.js?_debugResources=y&n=1354890505115:30:430)
at Object.Backbone.Marionette.Renderer.render (http://localhost:8080/myapp/js/backbone-app/conf/renderer.js?_debugResources=y&n=1354890505115:9:17)
at r.ItemView.r.View.extend.render (http://localhost:8080/myapp/js/lib/backbone/backbone.marionette.min.js?_debugResources=y&n=1354890505115:13:4719)
at  Backbone.Marionette.ExtLib.ExtLib.DetailsView.Backbone.Marionette.View.extend.renderFieldView (http://localhost:8080/myapp/js/lib/backbone.marionette.extlib.min.js?_debugResources=y&n=1354890505115:395:14)
// etc...

我认为问题在于 jasmine 不知道 ExtLib。如何监视该 renderFieldView 以避免错误?

预先感谢,一如既往。

4

1 回答 1

0

我认为问题在于 jasmine 不知道 ExtLib。

我无法从堆栈跟踪中判断您的诊断是否正确;但要验证这一点,您可以在 Jasmine 跑步者上查看源代码,并查看 ExtLib 是否包含在跑步者的页面中。

如果包括 ExtLib,则修复取决于您运行 Jasmine 的方式。如果您使用 Jasmine gem 并且您有一个 jasmine.yml 文件,您需要编辑 jasmine.yml 以包含 ExtLib。如果您有一个“简单”的配置,并且您正在手动维护 Jasmine 包含的 Javascript 文件,那么您需要添加一行以将 ExtLib 包含在运行程序的源文件中。

于 2012-12-07T16:12:55.657 回答