2014-12-08 2 views
0

Я тестирую Угловое приложение. Однако этот факт не должен иметь большого значения. Моя функция для тестирования выглядит следующим образом:Как измерить переменные var var

$scope.showItem = function (item) { 
     if (item.selected) { 
      activeItems.push(item); 
     } else { 
      var index = _.indexOf(activeItems, items); 
      activeItems.splice(index, 1); 
     } 
    }; 

Функция работает по желанию. Массив activeItems используется в другой функции, которая после некоторых изменений присваивает результат области. Поведение в том, что если элемент не выбран, он добавляется в массив. Если элемент уже выбран, он будет удален из массива.

it('should remove an item from the array', function() { 
     var activeItems = [{id: 1, selected: false}, {id:2, selected: true}]; 
     var item = { 
      id: 1, 
      selected: false 
     }; 
     expect(activeItems.length).toEqual(2); 
     scope.showItem(item); 
     expect(activeItems.length).toEqual(1); // FAIL! 
     // expects do not work for var variables. would work, if activeItems is assigned to the scope 
    }); 

Если я назначу activeItems к объему (scope.activeItems вместо вар activeItems), то все работает; однако я считаю, что если переменная не должна отображаться в представлении, она не должна быть назначена области.

Первый ожидать будет работать, так как определяется внутри блока:

expect(activeItems.length).toEqual(2); 

Во-вторых, не будет:

expect(activeItems.length).toEqual(1); 

, но это было бы для видимости переменных:

expect(scope.activeItems.length).toEqual(1); 

Мой вопрос состоит в как проверить значение var?

+2

Это звучит так, как будто вы пытаетесь проверить внутреннюю реализацию вашего метода. Сделайте шаг назад, подумайте о том, что ваша функция пытается достичь с точки зрения бизнеса/функциональности, и напишите ваши тесты в соответствии с этим. – DoctorMick

+1

Кроме того, 'activeItems' является свойством вашей' $ scope' в вашей текущей реализации 'showItem', поэтому для того, чтобы вы могли проверить, что на самом деле это что-то, нужно добавить его в область видимости, иначе это всего лишь глобальная переменная. Во-вторых, 'activeItems' должен быть назначен, поскольку вы используете его в обоих случаях выбора. –

+0

Спасибо за ваши комментарии (в том числе @ wyattbergeron1 ниже). Мне сказали, что не нужно прикреплять к переменным $ scope, которые не будут отображаться в представлении. Вот почему activeItems является глобальным var вместо $ scope.activeItems. Позже в коде activeItems используется для создания другого массива $ scope, который проверен правильно. Ваши ответы помогли выяснить, что нужно протестировать. – Marcin

ответ

0

Я не уверен, так как трудно сказать ваши намерения, и если у вас есть какие-либо другие глобальные переменные, но я думаю, что ваша ошибка заключается в том, что вы используете activeItems вне его области действия., Но опять же трудно сказать, потому что вы могут возникнуть другие глобальные проблемы. Если это activeItems находится за пределами его области, то it достигнет ошибки в expect, scope и expect еще раз. Тогда он не будет влиять на массив, и он останется таким, как он был отредактирован во время showItem

Надеюсь, это поможет!

Смежные вопросы