当前位置: 首页 > 知识库问答 >
问题:

如何在气体中测试触发功能?

胡劲
2023-03-14

Google Apps Script支持将事件传递给触发函数的触发器。不幸的是,开发环境将允许您在没有参数传递的情况下测试函数,因此您无法以这种方式模拟事件。如果您尝试,您会得到一个错误,如:

未定义e。

或者

TypeError:无法读取属性*从未定义

(其中e未定义)

人们可以将事件视为可选参数,并使用JavaScript中是否有更好的方法来执行可选函数参数的任何技术将默认值插入触发器函数。但这会带来一个风险,一个懒惰的程序员(如果是你,请举手!)会留下代码,带来意想不到的副作用。

当然还有更好的办法吗?

共有3个答案

唐麒
2023-03-14

2017年更新:使用Stackdriver Logging for Google Apps脚本调试事件对象。从脚本编辑器的菜单栏,转到:View

安慰log()将写入DEBUG级别的消息

示例onEdit():

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

onFormSubmit()示例:

function onFormSubmit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    namedValues: e.namedValues,
    range:  e.range.getA1Notation(),
    value:  e.value
  }

  console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e});
}

示例onChange():

function onChange (e) {
  var debug_e = {
    authMode:  e.authMode,  
    changeType: changeType,
    user:  e.user
  }

  console.log({message: 'onChange() Event Object', eventObject: debug_e});
}

然后检查Stackdriver UI中标记为消息字符串的日志以查看输出

姬寂离
2023-03-14

您不需要使用前面答案中建议的任何类型的模拟事件。

正如问题中所说,如果你直接在脚本编辑器中“运行”函数,像这样的错误

无法读取属性...从未定义

被抛出。这些都不是真正的错误。此错误仅仅是因为您在没有事件的情况下运行了该函数。如果你的函数没有按照预期的方式运行,你需要找出实际的错误:

要测试触发功能

>

  • 手动触发相应的事件:例如,要测试onEdit,请编辑工作表中的单元格;要测试onFormSubmit,请提交一个虚拟表单响应;要测试doget,请将浏览器导航到发布的webapp/execurl。

    如果有任何错误,它会记录到stackDrive。要查看那些日志,

    >

  • 在脚本编辑器中

    或者,单击此处

    您将在执行页面中找到执行列表。确保清除左上角的任何过滤器,如“以我的身份运行”,以显示所有执行情况。单击您感兴趣的执行,它将以红色显示导致触发器失败的错误。

    注意:有时,由于错误,日志不可见。尤其是在匿名用户运行webapp的情况下更是如此。在这种情况下,建议将默认的Google cloud项目切换为标准的Google cloud项目并使用View

    恭喜!您已经成功地解决了问题并跨越了第一个障碍。

  • 昝晗昱
    2023-03-14

    您可以编写一个测试函数,将模拟事件传递给触发器函数。下面是一个测试onEdit()触发器函数的示例。它传递一个事件对象,其中包含理解事件中“电子表格编辑事件”的所有信息。

    要使用它,请在目标onEdit函数中设置断点,选择functiontest\u onEdit并点击Debug

    /**
     * Test function for onEdit. Passes an event object to simulate an edit to
     * a cell in a spreadsheet.
     *
     * Check for updates: https://stackoverflow.com/a/16089067/1677912
     *
     * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
     */
    function test_onEdit() {
      onEdit({
        user : Session.getActiveUser().getEmail(),
        source : SpreadsheetApp.getActiveSpreadsheet(),
        range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
        value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
        authMode : "LIMITED"
      });
    }
    

    如果你很好奇,这是为了测试谷歌电子表格的onEdit函数而编写的,条件是三个单元格。

    以下是电子表格提交事件的测试函数。它通过读取表单提交数据来构建其模拟事件。这最初是为在onFormSubmit触发器中获取类型错误而编写的?。

    /**
     * Test function for Spreadsheet Form Submit trigger functions.
     * Loops through content of sheet, creating simulated Form Submit Events.
     *
     * Check for updates: https://stackoverflow.com/a/16089067/1677912
     *
     * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
     */
    function test_onFormSubmit() {
      var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
      var data = dataRange.getValues();
      var headers = data[0];
      // Start at row 1, skipping headers in row 0
      for (var row=1; row < data.length; row++) {
        var e = {};
        e.values = data[row].filter(Boolean);  // filter: https://stackoverflow.com/a/19888749
        e.range = dataRange.offset(row,0,1,data[0].length);
        e.namedValues = {};
        // Loop through headers to create namedValues object
        // NOTE: all namedValues are arrays.
        for (var col=0; col<headers.length; col++) {
          e.namedValues[headers[col]] = [data[row][col]];
        }
        // Pass the simulated event to onFormSubmit
        onFormSubmit(e);
      }
    }
    

    模拟事件时,请注意尽可能接近记录的事件对象。

    >

  • 如果希望验证留档,可以从触发器函数记录接收到的事件。

    Logger.log( JSON.stringify( e , null, 2 ) );
    

    在电子表格提交事件中:

    • 所有NamedValue值都是数组

    *单元格格式的“纯文本”会将日期保留为字符串,这不是一个好主意。

  •  类似资料:
    • 我有一个要求,我必须从Jira触发硒测试。Selenium测试是用编写的。完整的工作流程应该是这样的: 使用任何第三方插件从Jira开始测试执行 该测试将使用jenkins build pipeline在aws中运行 测试完成后,应在Jira中更新结果 我读过关于Jira的X射线插件,但在那里构建必须由jenkins触发,我不需要,因为我希望测试执行由Jira触发。 有没有办法做到这一点? 任何帮

    • 我有一个azure函数,当zip文件上传到azure blob存储容器时会触发它。我在内存中解压缩文件并处理内容并将结果添加/更新到数据库中。而对于db部分,我可以使用内存中的db选项。不知何故,我不太确定如何模拟blob触发器以进行单元测试此azure函数。 所有的官方示例和一些博客都主要讨论Http触发器(模拟httprequest)和队列触发器(使用IAsynCollection)。

    • 问题内容: 我有以下创建元素的AngularJS指令。输入具有运行功能的属性。在指令的单元测试中,我想检查用户更改输入时是否调用了函数。但是测试没有通过。虽然在手动测试时可以在浏览器中使用。 指示: 测试: 实时演示(ng-change):http : //plnkr.co/edit/0yaUP6IQk7EIneRmphbW?p=preview 现在,如果我手动绑定事件而不是使用属性,则测试通过。

    • 问题内容: 我有一个使用方法实现自定义的库,该方法将在调用时触发事件。我想测试该行为的方法。 我的自定义控件: 和测试: 问题在于该方法永远不会被调用,因此无法实现。 问题是:在这种情况下,我们如何进行测试?也许我们需要以某种方式强制运行循环? 编辑1:请注意,由于我正在测试库,因此我的测试目标没有任何主机应用程序。当测试目标具有主机应用程序时,以上测试通过。 问题答案: Apple的UICont

    • 问题内容: 我希望将原始的发布数据(例如,未参数化的JSON)发送到我的一个控制器进行测试: 但这给我一个symbolize_keys’ for 用什么发送原始帖子数据的正确方法是什么? 这是一些控制器代码: 问题答案: 我今天遇到了同一问题,找到了解决方案。 在您的内部定义以下方法: 在功能测试中,与方法一样使用它,但将原始文章正文作为第三个参数传递。 我在Rails 2.3.4上使用读取原始文

    • 问题内容: 我想对一个模拟占位符的指令进行单元测试,其中仅在键入/按下事件时才清除输入值。 问题答案: 您需要以编程方式创建一个事件并触发它。为此,将jQuery用于单元测试非常有用。例如,您可以编写一个简单的实用程序,如下所示: 然后在您的单元测试中使用它,如下所示: 您可以在http://angular-ui.github.io/bootstrap/项目中查看此技术的实际应用:https :