茉莉花测试,addEventListener
Jasmine test, addEventListener
我正在尝试使用 jasmine 编写测试。它适用于 angular 应用程序,我在其中使用 $window.open
打开 window,然后设置几个事件侦听器。
这是控制器:
$scope.login = function() {
LoadingService.show();
AccountsService.setPro($scope.pro);
if ($scope.pro) {
options.scope.push("repo");
}
var githubUrl = 'https://github.com/login/oauth/authorize?';
var authUrl = githubUrl + 'client_id=' + options.client_id + '&scope=' + options.scope;
var authWindow = $window.open(authUrl, '_blank', 'location=no,toolbar=yes,toolbarposition=top,closebuttoncaption=Close,clearcache=yes');
authWindow.addEventListener('loadstart', function(e) {
var url = (typeof e.url !== 'undefined' ? e.url : e.originalEvent.url),
raw_code = /code=([^&]*)/.exec(e.url) || null,
code = (raw_code && raw_code.length > 1) ? raw_code[1] : null,
error = /\?error=(.+)$/.exec(e.url);
if (code || error) {
authWindow.close();
}
// If there is a code, proceed to get token from GitHub
if (code) {
requestToken(code);
} else if (error) {
AlertService.raiseAlert("Oops! Something went wrong and we couldn't log you in using Github. Please try again.");
LoadingService.hide();
}
});
// If "Done" button is pressed, hide "Loading"
authWindow.addEventListener('exit', function(e) {
LoadingService.hide();
}, false);
};
这里是我写的测试 passed 因为它进不去 authWindow.addEventListener('loadstart', function(e) { ... }
it("Should go to the welcome screen.", function () {
spyOn(loadingService, 'show');
spyOn(accountsService, 'setPro');
spy = jasmine.createSpy('message');
window.addEventListener('message', function (e) {
console.log(Object.keys(e), e.data);
spy();
});
expect(scope.pro).toBeFalsy();
var controller = createController();
scope.togglePro();
expect(scope.pro).toBeTruthy();
scope.login();
expect(loadingService.show).toHaveBeenCalled();
window.postMessage('loadstart', 'http://www.github.com/?code="12313123');
// window.postMessage('exit', '*');
expect(accountsService.setPro).toHaveBeenCalledWith(scope.pro);
});
知道如何让它调用事件侦听器吗?
// in your test add a mock for window (remember to reset back to normal window after)
windowmock.open = function(url, target, settings){
//test the url, target and settings
return {
addEventListener: function(event, callback){
if (event == 'loadstart'){
callback({
url: 'something.com or whatever you're expecting,
originalEvent:{},
});
}
},
close: function(){}
}
};
我正在尝试使用 jasmine 编写测试。它适用于 angular 应用程序,我在其中使用 $window.open
打开 window,然后设置几个事件侦听器。
这是控制器:
$scope.login = function() {
LoadingService.show();
AccountsService.setPro($scope.pro);
if ($scope.pro) {
options.scope.push("repo");
}
var githubUrl = 'https://github.com/login/oauth/authorize?';
var authUrl = githubUrl + 'client_id=' + options.client_id + '&scope=' + options.scope;
var authWindow = $window.open(authUrl, '_blank', 'location=no,toolbar=yes,toolbarposition=top,closebuttoncaption=Close,clearcache=yes');
authWindow.addEventListener('loadstart', function(e) {
var url = (typeof e.url !== 'undefined' ? e.url : e.originalEvent.url),
raw_code = /code=([^&]*)/.exec(e.url) || null,
code = (raw_code && raw_code.length > 1) ? raw_code[1] : null,
error = /\?error=(.+)$/.exec(e.url);
if (code || error) {
authWindow.close();
}
// If there is a code, proceed to get token from GitHub
if (code) {
requestToken(code);
} else if (error) {
AlertService.raiseAlert("Oops! Something went wrong and we couldn't log you in using Github. Please try again.");
LoadingService.hide();
}
});
// If "Done" button is pressed, hide "Loading"
authWindow.addEventListener('exit', function(e) {
LoadingService.hide();
}, false);
};
这里是我写的测试 passed 因为它进不去 authWindow.addEventListener('loadstart', function(e) { ... }
it("Should go to the welcome screen.", function () {
spyOn(loadingService, 'show');
spyOn(accountsService, 'setPro');
spy = jasmine.createSpy('message');
window.addEventListener('message', function (e) {
console.log(Object.keys(e), e.data);
spy();
});
expect(scope.pro).toBeFalsy();
var controller = createController();
scope.togglePro();
expect(scope.pro).toBeTruthy();
scope.login();
expect(loadingService.show).toHaveBeenCalled();
window.postMessage('loadstart', 'http://www.github.com/?code="12313123');
// window.postMessage('exit', '*');
expect(accountsService.setPro).toHaveBeenCalledWith(scope.pro);
});
知道如何让它调用事件侦听器吗?
// in your test add a mock for window (remember to reset back to normal window after)
windowmock.open = function(url, target, settings){
//test the url, target and settings
return {
addEventListener: function(event, callback){
if (event == 'loadstart'){
callback({
url: 'something.com or whatever you're expecting,
originalEvent:{},
});
}
},
close: function(){}
}
};