5

所以我对整个测试都是新手(我一直是那些说'我应该编写单元测试......'但从未最终这样做过的人之一:-p)。我现在正在为这个项目编写单元测试。我正在使用 testacular + Jasmine 和 browserify 来编译东西。在我开始尝试做很多 AngularJS 注入工作之前,我没有遇到任何问题。

现在我只是试图对 ng-model 进行测试以了解所有这些。

我有一个 testacular.conf 文件,其中包含所有必要的内容:

files = [
    '../lib/jquery.js',
    '../lib/angular.js',
    './lib/jasmine.js',
    './lib/angular-mocks.js',
    JASMINE_ADAPTER,
    './tests.js' //compiled by browserify
];

我定义了我的控制器(MainCtrl.coffee)

MainCtrl = ($scope, $rootScope) ->
    $scope.hello = 'initial'

module.exports = (angularModule) ->
    angularModule.controller 'MainCtrl', ['$scope', '$rootScope', MainCtrl]
    return MainCtrl

我有自己的测试:(_MainCtrlTest.coffee,与 MainCtrl.coffee 在同一目录中)

testModule = angular.module 'MainCtrlTest', []
MainCtrl = require('./MainCtrl')(testModule)

describe 'MainCtrlTest', ->
    scope = null
    elm = null
    ctrl = null

    beforeEach inject ($rootScope, $compile, $controller) ->
        scope = $rootScope.$new()
        ctrl = $controller MainCtrl, $scope: scope
        elm = $compile('<input ng-model="hello"/>')(scope)

    describe 'value $scope.hello', ->

        it 'should initially equal input value', ->
            expect(elm.val()).toBe scope.hello

        it 'should change when input value changes', ->
            scope.$apply -> elm.val('changedValue')
            expect(scope.hello).toBe elm.val()

测试立即失败,输入的 elm.val() 返回空白,scope.hello 返回预期值('initial',在 MainCtrl.coffee 中设置)

我在这里做错了什么?

4

1 回答 1

10

要使其正常工作,您需要执行以下操作scope.$apply()

it 'should initially equal input value', ->
  scope.$apply()
  expect(elm.val()).toBe scope.hello

不要测试框架,测试你的代码

您的测试正在尝试测试 Angular 的绑定是否ng-model有效。您应该更信任框架并测试您的代码。

你的代码是:

  1. 控制器(设置初始scope.hello值)
  2. html 模板(以及其中的所有绑定、指令)

您可以非常轻松地测试第一个,甚至无需接触任何 DOM。这就是 AngularJS 的美妙之处——视图/逻辑的强分离。

在这个控制器中,几乎没有什么要测试的,只有初始值:

it 'should init hello', ->
  expect(scope.hello).toBe 'initial'

要测试第二个(模板 + 绑定),您需要进行 e2e 测试。你基本上想测试,模板是否不包含任何绑定等拼写错误……所以你想测试真正的模板。如果你在测试期间内联了一个不同的 html,那么你只是在测试 AngularJS。

于 2012-05-27T18:19:38.067 回答