Как создать модульный тест для функции, использующей $filter 'date'

Я пишу модульный тест для функции в моем контроллере.

Функция использует $filter для форматирования даты в формате «гггг-мм-дд».

Однако мой скрипт кармы не запускается после строки, в которой используется фильтр.

Вот функция:

$scope.myFunction = function (someDate) {

    var dateTo = new Date(someDate);
    var myDate = $scope.myDate;

    // Code fails after line below on unit test /////
    var searchdate = (filter('date')(myDate, 'yyyy-MM-dd'));
    searchdate = serviceConvertISODate.convertDate(searchdate);        
}

В приведенном выше примере var myDate = 1405967947000 (формат эпохи)

Модульный тест:

describe('Validating functions within Controller', function () {        

    var scope, ctrl, filter, localServiceConvertISODate;

    beforeEach(inject(function($controller, $rootScope, $filter, serviceConvertISODate) {
        scope = $rootScope.$new(),
        ctrl = $controller('MyController', {
            $scope: scope,
            filter : $filter,
            serviceConvertISODate : localServiceConvertISODate
        });                
    }));

    it('should test my function', function() {

        var dateTo = new Date("22 Sep 2014");
        console.log("********* dateTo = " + dateTo );

        var myDate = $scope.myDate;
        console.log("********* myDate = " + myDate );

        var searchdate = (filter('date')(myDate, 'yyyy-MM-dd'));
        console.log("searchdate after filter = " + searchdate);

        searchdate = localServiceConvertISODate.convertDate(searchdate);            

    });
});

Я вижу через свои журналы:

dateTo is returning the correct new date

myDate is returning the correct myDate

Однако применение следующей строки (фильтра) приводит к прерыванию теста и ошибка не возникает.


person Oam Psy    schedule 26.11.2014    source источник


Ответы (1)


Проверьте свой код. Вы передаете AngularJS $filter своему контроллеру как filter по какой-то причине (почему?), что может сработать, если ваш контроллер запрашивает эту инъекцию, но затем вы пытаетесь использовать переменную filter в своем тестовом коде, где ее значение не определено. Установите значение в вашем beforeEach(), если вы хотите использовать его позже:

filter = $filter;

Кроме того, я не уверен, что вы просто отлаживаете или предоставленный код показывает, что вы пытаетесь сделать. Если второе, обратите внимание, что юнит-тест должен тестировать ваш юнит «снаружи». Таким образом, он действительно должен вызывать ваш $scope.myFunction с некоторыми данными и проверять, соответствует ли результат вашим ожиданиям. Вы не копируете внутренности своей функции в свои тесты.

person hon2a    schedule 26.11.2014
comment
спасибо за ответ, это имеет смысл, однако я действительно новичок в тестировании, поэтому извиняюсь. Вы можете предоставить фрагмент кода? Я получаю TypeError: 'undefined' не является функцией (оценка '$filter('date')'), когда я пытаюсь. - person Oam Psy; 26.11.2014
comment
Вы читали руководство разработчика по модульному тестированию в AngularJS? Я бы начал с использования $filter в вашем коде и полного удаления filter. - person hon2a; 26.11.2014
comment
если я удалю фильтр и переменную searchdate = ($filter('date')(myDate, 'yyyy-MM-dd')); я получаю сообщение об ошибке ReferenceError: не удается найти переменную: $filter - person Oam Psy; 26.11.2014
comment
$filter('date') - это не фильтр, который я создал. Это рекомендация по преобразованию epoc с сайта Angular: $filter('date')(date, format, timezone) docs.angularjs.org/api/ng/filter/date - person Oam Psy; 26.11.2014
comment
Смотрите мой ответ. Если вы удалите filter, вам все равно придется сохранить $filter в переменной, которая видна в вашем тесте, если вы хотите использовать ее там. Видимость переменных — это базовая вещь, попробуйте сначала отладить перед повторной публикацией. - person hon2a; 26.11.2014
comment
спасибо, извините, я не видел второй абзац до момента назад. - person Oam Psy; 26.11.2014