将 Angularjs 应用程序中的对象公开给 Protractor 测试
Expose object fron Angularjs App to Protractor test
我正在使用量角器为基于 AngularJS 的应用程序编写端到端测试。有些情况需要使用模拟来测试——例如,网络连接问题。如果对服务器的 AJAX 请求失败,用户必须看到一条警告消息。
我的模拟在应用程序中注册为服务。我希望测试可以访问它们以编写如下内容:
var proxy;
beforeEach(function() { proxy = getProxyMock(); });
it("When network is OK, request succeeds", function(done) {
proxy.networkAvailable = true;
element(by.id('loginButton')).click().then(function() {
expect(element(by.id('error')).count()).toEqual(0);
done();
});
});
it("When network is faulty, message is displayed", function(done) {
proxy.networkAvailable = false;
element(by.id('loginButton')).click().then(function() {
expect(element(by.id('error')).count()).toEqual(1);
done();
});
});
如何实现 getProxyMock
函数以将对象从应用程序传递到测试?我可以在应用程序的 window
对象中存储代理,但仍然不知道如何访问它。
在阅读并更好地理解测试过程之后,它变成了不可能的。测试在 NodeJS 中执行,浏览器中的前端代码 - Javascript 对象实例无法在两个不同进程之间真正共享。
但是,有一个解决方法:您可以在浏览器中执行脚本。
首先,您的前端代码必须提供某种服务定位器,如下所示:
angular.module('myModule', [])
.service('proxy', NetworkProxy)
.run(function(proxy) {
window.MY_SERVICES = {
proxy: proxy,
};
});
然后,测试是这样的:
it("Testing the script", function(done) {
browser.executeScript(function() {
window.MY_SERVICES.proxy.networkAvailable = false;
});
element(by.id('loginButton')).click().then(function() {
expect(element.all(by.id('error')).count()).toEqual(1);
done();
});
});
请注意,当您使用executeScript
时,该函数被序列化以发送到浏览器执行。这提出了一些值得牢记的限制:如果您的脚本函数 returns 一个值,它是来自浏览器的原始对象的 克隆 。更新返回值会不会修改原来的值!同理,不能在函数中使用闭包。
我正在使用量角器为基于 AngularJS 的应用程序编写端到端测试。有些情况需要使用模拟来测试——例如,网络连接问题。如果对服务器的 AJAX 请求失败,用户必须看到一条警告消息。
我的模拟在应用程序中注册为服务。我希望测试可以访问它们以编写如下内容:
var proxy;
beforeEach(function() { proxy = getProxyMock(); });
it("When network is OK, request succeeds", function(done) {
proxy.networkAvailable = true;
element(by.id('loginButton')).click().then(function() {
expect(element(by.id('error')).count()).toEqual(0);
done();
});
});
it("When network is faulty, message is displayed", function(done) {
proxy.networkAvailable = false;
element(by.id('loginButton')).click().then(function() {
expect(element(by.id('error')).count()).toEqual(1);
done();
});
});
如何实现 getProxyMock
函数以将对象从应用程序传递到测试?我可以在应用程序的 window
对象中存储代理,但仍然不知道如何访问它。
在阅读并更好地理解测试过程之后,它变成了不可能的。测试在 NodeJS 中执行,浏览器中的前端代码 - Javascript 对象实例无法在两个不同进程之间真正共享。
但是,有一个解决方法:您可以在浏览器中执行脚本。
首先,您的前端代码必须提供某种服务定位器,如下所示:
angular.module('myModule', [])
.service('proxy', NetworkProxy)
.run(function(proxy) {
window.MY_SERVICES = {
proxy: proxy,
};
});
然后,测试是这样的:
it("Testing the script", function(done) {
browser.executeScript(function() {
window.MY_SERVICES.proxy.networkAvailable = false;
});
element(by.id('loginButton')).click().then(function() {
expect(element.all(by.id('error')).count()).toEqual(1);
done();
});
});
请注意,当您使用executeScript
时,该函数被序列化以发送到浏览器执行。这提出了一些值得牢记的限制:如果您的脚本函数 returns 一个值,它是来自浏览器的原始对象的 克隆 。更新返回值会不会修改原来的值!同理,不能在函数中使用闭包。