1

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

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

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

Вот функция:

$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);   
} 

В приведенном выше примере, переменная MyDate = 1405967947000 (формат EPOC) Тест

Единица:

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 

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

ответ

2

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

filter = $filter; 

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

+0

спасибо за отзыв, это имеет смысл, но я действительно новичок в тестировании, поэтому аплозии. Можете ли вы предоставить фрагмент кода? Я получаю TypeError: 'undefined' не является функцией (оценивая '$ filter (' date ')'), когда я пытаюсь. –

+1

Вы читали [руководство разработчика по модульному тестированию в AngularJS] (https://docs.angularjs.org/guide/unit-testing)? Я бы начал с использования '$ filter' в вашем коде и полностью удалив« фильтр ». – hon2a

+0

если я удалю фильтр и var searchdate = ($ filter ('date') (myDate, 'yyyy-MM-dd')); я получаю ошибку ReferenceError: Не могу найти переменную: $ filter –

0
describe('Service: myService', function() { 

    beforeEach(module('myApp')); 

    var myService, 
    httpBackend, 
    fromDate, 
    toDate; 

    var d = new Date(); 

    beforeEach(inject(function (_myService_, $httpBackend, $filter) { 
    myService = _myService_; 
    httpBackend = $httpBackend; 
    fromDate = $filter('date')(new Date(d - 86400000 * 15), 'yyyy-MM-dd'); 
    toDate = $filter('date')(d, 'yyyy-MM-dd'); 
    })); 

    // ... 

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