从主干测试触发器单击.打开新主干的视图.视图
Testing a trigger click from a Backbone.View which opens a new Backbone.View
我有两个主干视图,MainView
和PopupView
。
MainView包含一个帮助按钮。当启动帮助按钮处理程序时,它会显示Backbone.View.
我的问题是,我应该如何从MainView
模块测试这种行为?
这是我关于MainView
:的代码
var MainView = Backbone.View.extend({
events: {
'click #help' : 'showPopUp'
},
showPopUp: function() {
var popupView = new PopupView();
app.vent.trigger('showModal', popupView);
}
});
这是我关于mainView.spec:的代码
describe("When help button handler fired", function() {
beforeEach(function() {
this.view.render();
this.view.$el.find('#help').trigger('click');
});
it("shows the popup", function() {
// what should I do?
});
});
这是我关于应用程序的代码:
var app = new Marionette.Application();
app.addRegions({
header: '#header',
sidebar: '#sidebar',
main: '#main',
modal: '#modal'
});
app.vent.on('showModal', function(view) {
var modal = app.modal;
modal.show(view);
modal.$el.modal({
show: true,
keyboard: true,
backdrop: 'static'
});
});
如果你使用的是Sinon和Chai,你可以试试这个:
describe("When help button handler fired", function() {
beforeEach(function() {
this.popupSpy = sinon.spy()
app.vent.on('showModal', this.popupSpy);
this.view.render();
this.view.$el.find('#help').trigger('click');
});
it("shows the popup", function() {
this.popupSpy.callCount.should.equal(1);
this.popupSpy.args[0][0].should.be.an.instanceOf(PopupView);
});
});
所以主视图不应该打开弹出窗口,它甚至不应该知道存在这样的东西。它应该只是通过事件总线通知其他模块,应该通过触发事件来打开弹出窗口。
当你使用app.vent
时,我假设你使用的是提线木偶。在我的项目中,我有一个Marionette。Region来处理覆盖视图。这个区域应该打开/关闭视图。
这样做,测试起来容易多了。在主视图中,您可以监视app.vent
函数,并测试它是否会在单击按钮时执行。在您所在的地区,您可以在app.vent
上启动事件并监视您的view.render
功能。
在您想要测试的对象中创建新实例会使测试变得更加困难。当然,在JavaScript中更容易,例如在Java中,因为您可以在运行时在JavaScript中覆盖现有函数,但使用某种依赖注入方式会使模拟和监视依赖关系变得更容易。
这个怎么样:
describe("When help button handler fired", function() {
var popupShown;
beforeEach(function() {
popupShown = false;
this.view.render();
app.vent.on('showModal', function() {
popupShown = true;
});
this.view.$el.find('#help').trigger('click');
});
it("shows the popup", function() {
expect(popupShown).toBe(true);
});
});
也就是说,我会推荐一些东西:
- 正如前面提到的,不要在MainView中创建模态视图。这把两个人结合得太紧密了
- 在你的测试中,你可能想说一些类似
it("triggers the help event")
或类似的话。这一点尤其重要,因为您正在孤立地对该对象进行单元测试。对于集成测试,情况正好相反 - 我不确定你在
beforeEach
函数中是否做得太多。您可能希望至少触发it
范围内的按钮单击,尽管根据您的describe
操作,这可能是可以的
相关文章:
- 取消绑定主干视图事件
- 在不刷新整个网格的情况下,向Asp.net网格视图添加新行
- 如何测试主干视图是否正确侦听特定事件
- 如何在主干js中解析视图中的消息
- asp.net MVC,重定向到视图,视图打开新窗口到外部url,它'It’’’’我们被当成一种风景
- 正在Ajax调用上初始化主干视图
- 主干视图触发全局事件
- $routeParams在传递到新视图时未定义&控制器
- 从主干测试触发器单击.打开新主干的视图.视图
- 主干新视图反映旧模型数据
- 无法在单击按钮时调用视图函数主干
- 模板上添加了新$el,其中包含在主干视图中返回的 ajax 成功数据
- 在主干视图的点击事件中创建新的主干视图
- 如何在单独的文件中从另一个视图调用主干视图函数
- 如何通知模型中的视图更改主干中的值
- 一个用于多个视图的主干模型,谁处理 fetch()
- 将主干视图重新分配给新创建的DOM元素
- 支持模块化和多视图的主干路由
- 如何使用apply创建新的主干视图
- 操作后对列表视图进行主干排序和更新