AngularJS Promise Callback Not Trigged in JasmineJS Test

在使用AngularJS编写单元测试时,您可能会遇到Promise回调未触发的情况。这种情况通常出现在JasmineJS测试中,可能会导致测试失败或不完整。

问题描述

假设有一个服务myService ,它返回一个Promise对象,并在Promise resolve后执行回调函数:

-------------------------------------------- --------------- --- -
  ------ -
    -------- ---------- -
      --- -------- - -----------
      ---------------------------------------------- -
        --------------------------------
      ---
      ------ -----------------
    -
  --
---

在单元测试中,我们创建了一个spy函数来模拟这个回调函数,并在spy函数中进行断言:

--------------------- ---------- -
  --- ---------- ------------

  ----------------------------

  --------------------------------------- ------------- -
    --------- - ------------
    ----------- - -------------
  ----

  ---------- --- ------ ---------- -
    --- --- - -----------------------------
    ------------------------------
    --------------------------------------------- ----- --------
    --------------------
    -------------------------------
  ---
---

然而,当运行测试时,我们会发现spy函数并没有被调用,测试也失败了。

问题原因

这个问题是由于JasmineJS在异步代码中无法捕获Promise对象的resolve事件所导致的。在上面的测试中,JasmineJS无法捕获Promise的resolve事件并触发spy函数。

解决方案

为了解决这个问题,我们可以使用AngularJS提供的$rootScope.$apply()函数来显式触发Promise的resolve事件。修改测试代码,如下所示:

---------- --- ------ -------------- -
  --- --- - -----------------------------
  ------------------------------
  --------------------------------------------- ----- --------
  --------------------
  --------------------- -
    -------------------------------
    -------
  -- ---
  --------------------
---

通过将$rootScope.$apply()放在setTimeout()之前,我们可以确保Promise的resolve事件已经完成,然后再触发spy函数并执行断言。

深度学习和指导意义

在AngularJS单元测试中遇到Promise回调未触发的问题是很常见的。这种情况通常出现在异步代码中。虽然我们可以使用上述方法来解决这个问题,但更好的方法是使用AngularJS提供的$timeout服务来模拟异步代码,并避免使用setTimeout。

此外,通过深入研究AngularJS的Promise API,我们可以更好地理解它们的工作原理,并编写更健壮的单元测试。对于那些想要进一步提高编写AngularJS单元测试技能的开发者来说,官方文档是一个很好的资源。

示例代码

完整的测试代码如下所示:

--------------------- ---------- -
  --- ---------- ------------ -----------

  ----------------------------

  --------------------------------------- ------------- ------------- -
    --------- - ------------
    ----------- - -------------
    ---------- - -------------
  ----

  -------------------- -
    ---------------------------------------------
    -----------------------------------------
  ---

  ---------- --- ------ -------------- -
    --- --- - -----------------------------
    ------------------------------
    --------------------------------------------- ----- --------
    --------------------
    --------------------- -
      -------------------------------
      -------
    -- ---
    --------------------
  ---
---

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/25508