【问题标题】:How can I trigger ui-sref in an AngularJS unit test? [duplicate]如何在 AngularJS 单元测试中触发 ui-sref? [复制]
【发布时间】:2015-10-05 00:27:40
【问题描述】:

我正在测试一个 AngularJS 视图。此代码示例中有一些非标准帮助程序,但希望它能够理解这一点。我相当肯定它们都不会干扰相关功能。

这是视图(在 Jade 中):

#authentication-options
  button#sign-up(ui-sref='sign-up') Create an Account
  a#sign-in(ui-sref='sign-in') I already have an account.

以及规格:

spec 'AuthenticationOptions', ->
  beforeEach ->
    @view = $view 'authentication-options.html'

  describe 'elements', ->
    describe 'sign up button', ->
      beforeEach ->
        @button = findSelector 'button#sign-up', in: @view

      it 'exists', ->
        expectElement @button

      # I would expect to be able to test this using
      # `triggerHandler`, but it doesn't work.
      it 'transitions to sign up when clicked', ->
        # @button is the #sign-up button node wrapped with angular.element.

        @button.triggerHandler('click')
        get('$rootScope').$digest()
        expect(get('$state').current.name).to.eq 'sign-up'

这在浏览器中有效,但规范不会改变状态。 (我收到:AssertionError: expected 'authentication-options' to equal 'sign-up'

整个模块,包括ui-router 和配置状态,都已加载完毕。

我是否应该在这里触发另一个事件,或者在单元/集成测试而不是完整的 E2E 中测试此按钮行为的其他方法?

【问题讨论】:

  • 您不再测试单个单元,而是测试它们的互操作性(上面的链接证实了这一点)。这也可能很棘手,并且与您在浏览器中看到的不同,因此您最终可能会两次测试相同的东西。我会为 e2e/集成保存 dom 测试,至少对于这样复杂的场景。
  • 这是一个很好的观点@estus。我发现当以 BDD 风格使用 Angular 时,E2E 和单元测试之间的界限很快就模糊了。我没有完全测试 DOM,因为我完全通过 $compile 服务工作。我正在测试 Angular 应用程序的状态并假设 DOM 会正常运行。这绝对不是单元测试,但它比 E2E 快得多,并且允许对可能有大量逻辑分支的表单等进行行为驱动的测试。

标签: javascript angularjs unit-testing angular-ui-router


【解决方案1】:

在您使用@button.triggerHandler('click') 之后,您可能需要$timeout.flush();

见:https://stackoverflow.com/a/25503524/5246

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2015-10-30
    • 2013-08-02
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多