【发布时间】:2017-07-27 17:07:05
【问题描述】:
我正在使用 Protractor 在我的 Angular Web 应用程序上运行集成测试。我的 Web 应用程序使用我的自定义 Angular 服务 ApiClient 进行 API 调用。我用browser.addMockModule 和angular.module().factory() 模拟该服务。这让我可以模拟我所有的后端 API!这是我的代码:
setup() {
// Out in WebDriver.
// Third argument 'apiRequestsMap' is made available as an argument 'map'
// to the anonymous function which constructs the module.
browser.addMockModule(
'mockDataModule',
(map) =>
angular.module('mockDataModule', []).value('apiRequestsMap', map),
this.apiRequestsMap_);
const apiModuleMaker = () => {
const mockModule = angular.module('mockapiModule', ['mockDataModule']);
mockModule.factory(
'apiClient',
($q, apiRequestsMap) => ({
request: (req) => {
// In Browser.
// I can access 'apiRequestsMap'!
// And I use it to mock those API calls.
}
}));
};
browser.addMockModule('mockapiModule', apiModuleMaker);
browser.get('www.mywebpage.com/example');
}
这很好用,让我可以在 Protractor 测试中设置模拟 API。重要的部分是我可以将 this.apiRequestsMap_ 变量从 WebDriver 传递到浏览器作为 apiRequestsMap。
现在我想知道 - 我可以做相反的事情吗? 如何将变量从浏览器传回 WebDriver?
我的第一次尝试只是编辑我传入的apiRequestsMap 对象。但这似乎是单向传输。即,在浏览器中,设置apiRequestsMap.aVar = 5; 不会改变this.apiRequestsMap_.aVar。
查看 Protractor API,我还找到了browser.getRegisteredMockModules。不幸的是console.log(JSON.stringify(browser.getRegisteredMockModules())); 打印出[null, null, null, null, null]。
抱歉发布了这么多代码和上下文!我有点不知所措,所以我不确定我可以删除哪些部分,同时让我的代码仍然运行。也许有更好的方法直接使用 WebDriver 模拟 API 调用?这将是一个很好的解决方法。
另一个可能的收获是我向 Protractor 开发人员提交功能请求/错误。
【问题讨论】:
-
你要传递什么对象?它只有值吗?可以转成 JSON 吗?您是否可以直接在浏览器控制台中打印该数据而无需使用 Selenium 执行 JS 代码?
-
理想情况下,我想要传递的完整对象是一个对象数组(都可以使用 JSON.stringify 进行转换)。我现在可以通过
console.log(JSON.stringify(req));亲自访问它。不知道如何通过代码访问它,但感谢您的想法! -
因为我只是在编写测试,所以我也可以只用
assert或其他故障条件“交流”。这可能是我接下来要尝试的。
标签: javascript angularjs selenium-webdriver protractor