【发布时间】: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