【问题标题】:Using variables in httpBackend mock function在 httpBackend 模拟函数中使用变量
【发布时间】:2016-08-02 00:29:08
【问题描述】:

我希望能够定义一个变量,然后在 module.run() 函数内的 respond() 方法中使用该变量。我的 it() 中有这段代码:

    var testValue=randomValue(); // suffice to say, a random value generator
    var httpBackendMock = function() {
        angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app'])
            .run(function($httpBackend) {
                $httpBackend.whenPOST(/.*\/api\/data/).respond(function(method, url, data, headers) {
                    return [200, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?> \
                    <data>'+testValue+'</data>', {}];
                });
....

但在httpBackendMock 对象上方定义的testValue 变量在run() 函数中根本不可见,而是“未定义”。

我的理解是 JS 中的 'var' 定义的变量可用于内部范围的代码,但这里不会发生这种情况。有没有办法让变量在那里工作?

【问题讨论】:

  • httpBackendMock 不是一个对象。它是一个函数。请展示它会发生什么。如果用browser.executeScript(httpBackendMock)执行,这显然是行不通的,因为外部函数作用域运行在Node中,而内部函数作用域运行在浏览器中。
  • @estus 来自docs.angularjs.org/api/ngMockE2E/service/$httpBackend。我用 ngmocke2e 标记它,因为我可能需要熟悉该框架的人。
  • 您发布的链接中没有提到httpBackendMock 功能。请说明这个函数是如何被调用的。
  • browser.addMockModule('httpBackendMock', httpBackendMock); 来自product.moveline.com/…的示例

标签: angularjs mocking protractor ngmocke2e


【解决方案1】:

这段代码

var testValue=randomValue();

在 Node.js 中执行。还有这段代码

function() {
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app'])
    ...
}

转换为字符串,传递给客户端,在浏览器中执行。

外部函数作用域在内部函数中不可用,这解释了为什么testValuehttpBackendMock 函数中是undefined,如果httpBackendMock 函数使用严格模式会抛出错误。

其他数据可以通过executeScriptaddMockModule 额外参数传递,这些参数将在客户端可用。

正如in documentation 所示,前两个之后的参数被传递给浏览器。

应该是这样的

var httpBackendMock = function(testValue) {
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app'])
    ...
}
...
var testValue=randomValue();
browser.addMockModule('httpBackendMock', httpBackendMock, testValue);

【讨论】:

    【解决方案2】:

    答案是传入一个嵌套的值数组,并在模拟模块对象的函数签名中添加一个参数。

    var httpBackendMock = function(args) {
        var isFoo=args[0];
        var isBar=args[1];
    ...
    browser.addMockModule('httpBackendMock', httpBackendMock, [['foo','bar']]);
    

    在以下位置找到答案: Protractor addMockModule additional arguments not working?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多