2015-06-03 2 views
0

Фрагмент моего теста:Угловое + жасмин, совместное использование услуг между тестами и контроллером

describe('SaleTypeCtrl', function(){ 
var scope, ctrl, $httpBackend; 
var operator = {"OperatorId" : 24, "Number" : 4, "OperatorName" : "Heyah", "LogoUrl" : "http://www.sample.pl/logo.jpg" }; 

beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $state, _Sale_) { 
    $httpBackend = _$httpBackend_; 
    state = $state; 
    scope = $rootScope.$new(); 
    Sale = _Sale_; 
    ctrl = $controller('SaleTypeCtrl', {$scope: scope}); 
    Sale.setOperator(operator); 
})); 

it('Loads transaction types', function() { 
    expect(Sale.getOperator().OperatorId).toEqualData(24); 
    $httpBackend.expectGET('api/transactionTypes?OperatorId=24'). 
    respond(
    [ 
     {"Type" : "Offline", "ButtonText" : "OFFLINE [KOD DOŁADOWUJĄCY]", "ButtonConfirmText" : "POBIERZ KOD", "Available" : true, "ConfirmationTypes" : ["Wydruk","Email"] }, 
     {"Type" : "Online", "ButtonText" : "ONLINE [DOŁADOWANIE]", "ButtonConfirmText" : "DOŁADUJ TELEFON", "Available" : true, "ConfirmationTypes" : ["Brak","Wydruk","Email"] } 
    ]); 
    $httpBackend.flush(); 
    expect(scope.data.TransactionTypes).toEqualData(
    [ 
     {"Type" : "Offline", "ButtonText" : "OFFLINE [KOD DOŁADOWUJĄCY]", "ButtonConfirmText" : "POBIERZ KOD", "Available" : true, "ConfirmationTypes" : ["Wydruk","Email"] }, 
     {"Type" : "Online", "ButtonText" : "ONLINE [DOŁADOWANIE]", "ButtonConfirmText" : "DOŁADUJ TELEFON", "Available" : true, "ConfirmationTypes" : ["Brak","Wydruk","Email"] } 
    ]); 
}); 

Фрагмент моей службы:

.factory('Sale', function($http){ 
var service = {}; 

service.operator = null; 

service.getOperator = function(){ 
    return service.operator; 
} 

service.setOperator = function(operator){ 
    service.operator = operator; 
} 

service.getTransactionTypes = function() { 
    return $http.get('api/transactionTypes', {params: {"OperatorId" : service.getOperator().OperatorId}}); 
} 

Мой контроллер:

.controller('SaleTypeCtrl', function ($scope, $state, Sale) { 
$scope.data = {}; 
$scope.loadTransactionTypes = function(){ 
    Sale.getTransactionTypes().success(function(transactionTypes){ 
     $scope.data.TransactionTypes = transactionTypes; 
    }).error(function(err){ 
     console.error("Błąd"); 
    }); 
} 
$scope.loadTransactionTypes(); 
}) 

Мой тест не пройден :

Sales controllers SaleTypeCtrl Loads transaction types FAILED 
     TypeError: Cannot read property 'OperatorId' of null at Object.service.getTransactionTypes 

Sale.setOperator(operator) правильно устанавливает значение для моего теста.

expect(Sale.getOperator().OperatorId).toEqualData(24) проходит правильно.

Я попытался изменить его таким образом:

ctrl = $controller('SaleTypeCtrl', {$scope: scope, Sale:Sale}); 

, но до сих пор не фиксированная моя проблема. Кажется, что у контроллера есть другой экземпляр Sale.

Как мне изменить свой тест, чтобы установить некоторые начальные значения для заводского ввода в контроллер?

ответ

1

В beforeEach(), вы построение контроллера, который вызывает $scope.loadTransactionTypes(), который вызывает Sale.getTransactionTypes(), который выполняет service.getOperator().OperatorId, который терпит неудачу, потому что оператор находится на службе только после того, как контроллер был создан.