2014-04-10 3 views
0

Я пытаюсь выполнить проверку единиц измерения с помощью QUnit, но получаю сообщения об ошибках: $ httpBackend.whenGET не является функцией, $ httpBackend.when не является функцией. Я включил угловые mocks и услуги углового бриза (http://www.breezejs.com/documentation/breeze-angular-service), который использует угловую библиотеку q для обещаний и httpbackend вместо $ .ajax для передачи данных. Я все еще не могу издеваться над любыми вызовами на сервере. Некоторые примеры кода:Единичное тестирование Угловое с Breeze

var $httpBackend, 
    injector; 
    var SPAModule = angular.module("spa"); 
    injector = angular.injector(['ng', 'spa']); 
    $httpBackend = injector.get("$httpBackend"); 
    SPAModule.config(function ($provide) { 
     $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); 
    }); 

тест («Когда контроллер называется, то он должен быть создан с правильными данными о масштабах», функция() { «использовать строгое»;

// Given 
$httpBackend.whenGET("/Breeze/Data/Jobs").respond({ data: jobData }); 
$httpBackend.whenGET("/Breeze/Data/Metadata").respond({}); 
var routeParams = { id: "b" }, 

// When 
    controller = injector.get('$controller')(toriga.propertyController, { 
     $scope: theScope, 
     $window: windowMock, 
     $location: locationMock, 
     $routeParams: routeParams 
    }), 
    $rootScope = injector.get('$rootScope'); 
$httpBackend.flush(); 
$rootScope.$apply(); // forces results of promise to be executed 

// Then 
notEqual(controller, null, 'controller was created properly'); 
strictEqual(theScope.pageTitle, "Property", "pageTitle was set on the scope"); 
notEqual(theScope.job, null, "Job set on the scope"); 
ok(toastrMock.warning.notCalled, "No warning messages were displayed"); 
ok(toastrMock.error.notCalled, "No error messages were displayed"); 

});

Этот код работал нормально, когда я не использовал ветер, но теперь я переключился, я не могу заставить его работать, а документация оставляет желать лучшего. Любая помощь будет оценена по достоинству.

ответ

1

Я не могу рассказать все детали ваших тестов. Я могу предложить некоторый комфорт, чтобы он работал ... и в значительной степени, как и следовало ожидать.

Вот выдержка из испытаний/спецификации/lookups.spec в образце «ZZA-узел Монго» (it's in github), в котором я переиграть через $httpBackend макет а (подмножество) отклик сервера к Запрос клиента Breeze для объектов поиска «lookup».

Я использую Жасмин вместо QUnit, но надеюсь, что вы получите картину.

// simplified for presentation here but materially sufficient 
describe("when lookups service receives valid lookups data", function() { 

    var $httpBackend, flush$q, lookups 
    var lookupsUrlRe = /breeze\/zza\/Lookups\?/; // RegEx of the lookups endpoint 

    beforeEach(module('app')); 

    beforeEach(inject(function(_$httpBackend_, $rootScope, _lookups_) { 
     $httpBackend = _$httpBackend_; 
     flush$q = function() { $rootScope.$apply(); }; 
     lookups = _lookups_; 
    })); 

    beforeEach(function() { 
     $httpBackend.expectGET(lookupsUrlRe).respond(validLookupsResponse.data); 
     lookups.ready(); // THIS TRIGGERS CALL TO FETCHLOOKUPS 
     $httpBackend.flush(); 
    }); 

    it("doesn't bomb", function() { 
     expect(true).toBe(true); 
    }); 

    it("'ready()' invokes success callback", function() { 
     var success = jasmine.createSpy('success'); 
     lookups.ready(success); 
     flush$q(); // NOTE NEED TO FLUSH $Q IN THIS TEST 
     expect(success).toHaveBeenCalled(); 
    }) 

    it("has OrderStatus.Pending", function() { 
     expect(lookups.OrderStatus && lookups.OrderStatus.Pending).toBeDefined(); 
    }); 

    ... more tests ... 

}); 

Услуга "поиски" (приложения/услуги/lookups.js) вызывает ветер для извлечения данных Lookups с сервера.

function fetchLookups() { 
    return breeze.EntityQuery.from('Lookups') 
     .using(manager).execute() 
     .then(function() { 
      logger.info("Lookups loaded from server."); 
      extendService(manager) 
     }) 
     .catch(function (error) { 
      error = util.filterHttpError(error); 
      logger.error(error.message, "lookups initialization failed"); 
      throw error; // so downstream fail handlers hear it too 
     }); 
} 

Как вы можете себе представить, это тест довольно глубокая интеграция, которая начинается с услугой, потребляемой ViewModel и проходит весь путь через Угловое службы Breeze через $http только о границе сети перед тем, как перехвачен $httpBackend.

+0

Где скрывается $ q(); существовать? Я получаю функцию не существует – johnstaveley

+0

Обратите внимание, что я определил ее во втором 'beforeEach'. Это просто сахар над $ rootScope. $ Apply(), который (на мой взгляд) не передает намерения, а также «flush $ q» или «flushPromiseQueue». – Ward

+0

Привет, функция Inject специфична для жасмина, поскольку я сказал, что использую QUnit. – johnstaveley

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