Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Jasmine测试主干视图时,浏览器页面保持刷新_Javascript_Backbone.js_Jasmine - Fatal编程技术网

Javascript 使用Jasmine测试主干视图时,浏览器页面保持刷新

Javascript 使用Jasmine测试主干视图时,浏览器页面保持刷新,javascript,backbone.js,jasmine,Javascript,Backbone.js,Jasmine,运行下面的Jasmine测试(1),测试成功执行,但我面临主测试页面的递归加载 这是我的测试(1)和正在运行测试(2)的模块: 有什么想法吗?我如何解决这个问题 附言: 问题只涉及Chrome和Safari浏览器。 下面是一个示例:jsfiddle.net/shioyama/EXvZY (一) (二) 主干使用委托事件,该事件在创建视图时绑定。创建view.el时,它不包含表单,而是在render方法中创建表单。这就是为什么submit delegate事件没有绑定,而是在页面上提交表单。表

运行下面的Jasmine测试(1),测试成功执行,但我面临主测试页面的递归加载

这是我的测试(1)和正在运行测试(2)的模块:

有什么想法吗?我如何解决这个问题

附言:
问题只涉及Chrome和Safari浏览器。
下面是一个示例:jsfiddle.net/shioyama/EXvZY


(一)


(二)

主干使用委托事件,该事件在创建视图时绑定。创建view.el时,它不包含表单,而是在render方法中创建表单。这就是为什么submit delegate事件没有绑定,而是在页面上提交表单。表单提交到同一个URL,这会触发Jasmine套件再次运行,从而产生一个循环

如果您稍微修改一下代码,您会发现这个版本可以工作,因为元素在生成视图之前就存在了

var MyView = Backbone.View.extend({
    events: {
        'submit form' : 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();
        // some code
    }
});

//start test runner right after we're done defining our tests in this script
window.setTimeout( function(){
    jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
    jasmine.getEnv().execute();
}, 0 );

//TESTS GO HERE
describe('When Submit button handler fired', function () {
    beforeEach(function () {
        spyOn(MyView.prototype, 'submitForm').andCallThrough();
        this.view = new MyView({
            el: $('<div><form><input type="submit" value="Submit" /></form></div>')
        });
        this.view.$el.find('form').submit();
    });

    it('submitForm should be called', function () {
        expect(MyView.prototype.submitForm).toHaveBeenCalled();
    });
});​
var MyView=Backbone.View.extend({
活动:{
“提交表单”:“提交表单”
},
submitForm:函数(事件){
event.preventDefault();
//一些代码
}
});
//在此脚本中定义完测试后立即启动test runner
setTimeout(函数(){
jasmine.getEnv();
jasmine.getEnv().execute();
}, 0 );
//测试在这里进行
描述('提交按钮处理程序启动时',函数(){
beforeach(函数(){
spyOn(MyView.prototype,'submitForm')。和callthrough();
this.view=newmyview({
el:$('')
});
this.view.$el.find('form').submit();
});
它('应该调用submitForm',函数(){
expect(MyView.prototype.submitForm).toHaveBeenCalled();
});
});​

我已在此处为此创建了一个JSFIDLE:。测试通过了,我没有看到任何递归加载,但也许我不知道该寻找什么。你能澄清一下你的意思吗?抱歉,这是链接:@shioyama,谢谢你创建了JSFIDLE。你明白我的意思吗?不,不幸的是,我不明白你在说什么。它出现在JSFIDLE中了吗?@shioyama-your就是一个很好的例子。无论如何,问题只涉及Chrome和Safari。尝试在Chrome或Safari中运行load,您将看到问题。谢谢您的回答。你的解释很清楚。无论如何,如果我创建
this.view
而不调用
render
则执行测试
this.view时不会调用
MyView.prototype.submitForm
。$el.find('form').submit()
此.view.$el.submit()。有什么想法吗?这是使用你的建议的jsfidlle,它不起作用。如果我遗漏了什么,请纠正我!两件事:#1:委托事件使用选择器,因此它们不会绑定到根节点-我添加了一个div作为容器:您添加了一个spy,但不允许调用向下传播到spied元素,这意味着提交处理程序永远不会返回false-需要添加.andCallThrough()。您现在可以奖励吗?;)
var MyView = Backbone.View.extend({
    events: {
        'submit form' : 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();
        // some code
    }
});
var MyView = Backbone.View.extend({
    events: {
        'submit form' : 'submitForm'
    },

    submitForm: function (event) {
        event.preventDefault();
        // some code
    }
});

//start test runner right after we're done defining our tests in this script
window.setTimeout( function(){
    jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
    jasmine.getEnv().execute();
}, 0 );

//TESTS GO HERE
describe('When Submit button handler fired', function () {
    beforeEach(function () {
        spyOn(MyView.prototype, 'submitForm').andCallThrough();
        this.view = new MyView({
            el: $('<div><form><input type="submit" value="Submit" /></form></div>')
        });
        this.view.$el.find('form').submit();
    });

    it('submitForm should be called', function () {
        expect(MyView.prototype.submitForm).toHaveBeenCalled();
    });
});​