Запуск тестов с localStorage

#gruntjs #yeoman #yeoman-generator-angular

#gruntjs #йомен #yeoman-генератор-angular

Вопрос:

я следовал этому руководству от Codelab и yeoman. При правильной реализации вы используете локальное хранилище для хранения списка задач. У меня проблемы с настройкой моих тестов, чтобы проверить, работает ли это. Это то, что у меня есть до сих пор:

 'use strict';

describe('Controller: MainCtrl', function () {

  // load the controller's module
  beforeEach(module('yeoTodoApp'), module('LocalStorageModule'));

  var MainCtrl,
    scope;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope, $httpBackend) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
      $scope: scope
    });
  }));

  it('should add items to the list', function () {
    var beforeLength = scope.todos.length;
    scope.todo = 'Test 1';
    scope.addTodo();
    var afterLength = scope.todos.length;
    expect(afterLength-beforeLength).toBe(1);
  });
it('should add items to the list then remove', function () {
    var beforeLength = scope.todos.length;
    scope.todo = 'Test 1';
    scope.addTodo();
    scope.removeTodo(0);
    var afterLength = scope.todos.length;
    expect(afterLength-beforeLength).toBe(0);
  });

});
 

Ошибка, которую я получаю,

строка 12 col 68 ‘$httpBackend’ определена, но никогда не использовалась. });

Как бы я написал свои модульные тесты для размещения в локальном хранилище?

Комментарии:

1. ваша ошибка — ошибка jslint, просто удалите $httpBackend из аргументов вашей функции…

2. Спасибо за помощь. Если я удалю $httpBackend из аргументов моей функции, я получу те же тесты, что и без localstorage Controller: MainCtrl should add items to the list then remove FAILED

Ответ №1:

Я думаю, что на данный момент идея как бы издевается над вашим локальным хранилищем:

Написание модульных тестов

Для дополнительной проблемы вернитесь к модульному тестированию на шаге 8 и подумайте, как вы могли бы обновить свои тесты теперь, когда код использует локальное хранилище.

Совет: это не прямой ответ и требует знания о макетных сервисах. Ознакомьтесь с рекомендациями по модульному тестированию в AngularJS, в частности, с издевательскими сервисами и модулями в разделе AngularJS.

С тех пор, как был задан этот вопрос, возможно, что-то изменилось. Во всяком случае, вот мое решение:

 'use strict';

describe('Controller: MainCtrl', function () {

  // load the controller's module
  beforeEach(module('mytodoyoappApp'));

  var MainCtrl,
    scope,
    localStorage, store;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();

    MainCtrl = $controller('MainCtrl', {
      $scope:scope
      // place here mocked dependencies
    });

    /*mock the localStorageService*/
    store={};

    localStorage = {
      set: function(key, value) {
        store[key] = value;
      },
      get: function(key) {
        return store[key];
      }
    };

  }));

  it('should check the list length', function () {
    expect(MainCtrl.todos.length).toBe(0);
  });

  it('should add items to the list', function () {
    MainCtrl.todoadded = 'Test 1';
    MainCtrl.addTodo();
    expect(MainCtrl.todos.length).toBe(1);
  });

  it('should add then remove an item from the list', function () {
    MainCtrl.todoadded = 'Test 2';
    MainCtrl.addTodo();
    MainCtrl.removeTodo(0);
    expect(MainCtrl.todos.length).toBe(0);
  });

  it('should check that the localstorage is undefined before being set', function() {
    var a=localStorage.get('todos');
    expect(a).toBeUndefined();
  });

  it('should set and get the localstorage', function() {
    localStorage.set('todos', ['Test 3']);
    var a=localStorage.get('todos');
    expect(a).toEqual(['Test 3']);

    localStorage.set('todos', ['Test 4']);
    var b=localStorage.get('todos');
    expect(b).toEqual(['Test 4']); 
  });
});
 

Ответ №2:

теперь ваша настройка верна (после удаления $httpBackend из списка аргументов)

 Controller: MainCtrl should add items to the list then remove FAILED
 

эта ошибка является простой тестовой ошибкой, которая означает, что ваш код где-то работает не так, как ожидалось (ваш второй тест завершается неудачей)

я бы для себя проверил длину todos, а не результат математической операции.

я бы написал для ваших тестов тест следующим образом:

 it('should add items to the list then remove', function () {
  scope.todo = 'Test 1';
  expect(scope.todos.length).toBe(0);
  scope.addTodo();
  expect(scope.todos.length).toBe(1);
  scope.removeTodo(0);
  expect(scope.todos.length).toBe(0);
});
 

вы используете jasmine в качестве инструмента тестирования. jasmine регистрирует ошибки, которые точно не соответствуют ожиданиям, поэтому вы должны получить что-то вроде

 expect '1' to be '0'
 

идите оттуда!