我正在用Siesta测试ExtJS前端。这是我的登录/注销测试:
StartTest(function(t) {
t.diag("Login/Logout");
t.chain(
{ waitForCQ : '#loginPanel' },
function(next) {
t.cq1("#username").setValue();
t.cq1("#password").setValue();
next();
},
{ click: '>> #username' },
{ type: '******', target : '>> #username' },
{ type: '******', target : '>> #password' },
{ click: '>> #loginButton' },
{ waitForCQ: '#mainView' },
{ click: '>> #logoutButton' },
{ waitForCQ: 'messagebox #ok' },
function(next) {
t.waitForEvent(Ext.globalEvents, 'logoutComplete', function () {});
next();
},
{ click : '>> messagebox #ok' },
function() {
t.done();
}
);
});
测试将用户名和密码输入到登录面板中,然后单击登录按钮。加载主视图后,它将注销。出于某种原因,这个测试永远不会结束。
链中的每一个操作都是成功的,但测试仍然处于运行状态。
我该怎么解决这个问题?
我使用的是带有ExtJS 5.1.0的siesta-3.0.2 lite。
1#首先,您可以尝试删除t.done((,它在测试中通常不需要,除非您真的在等待它。needDone在线束设置中的默认值为False。
2#您正在使用waitForEvent,这通常是在您将回调传递到那里时完成的。所以你的函数应该是这样的:
function(next) {
t.waitForEvent(Ext.globalEvents, 'logoutComplete', next);
},
但是,如果您只想知道事件已被触发,可以使用函数firesOnce。不要忘记,在执行触发事件的操作之前,您需要注册检查事件。
所以你的代码可能是这样的:
function(next) {
t.firesOnce(Ext.globalEvents, 'logoutComplete','Logout completed!');
next();
},
{ click: '>> #logoutButton' },
{ waitForCQ: 'messagebox #ok' },
{ click : '>> messagebox #ok' },
但我从未使用Ext.globalEvents来检查事件,所以我不确定它是否有效。
Harness.configure({
...
overrideSetTimeout: false,
...
});
Siesta从每个测试的上下文中重写本机"setTimeout"以进行异步代码跟踪,但这似乎会导致问题。它对论坛上的许多用户都有效,告诉我它是否对你有效,因为它没有解决我的问题。
更新:
我这边的问题原来是由于注销本身,它使用window.location.reload()
。如果存在两个独立的页面/应用程序,这将使浏览器发挥作用。
显然,您需要将harness对象中的separateContext选项设置为true此选项仅在标准(商业(软件包中提供