2015-06-26 5 views
1

Я пишу угловой контроллер, у которого есть зависимость от dataservice (служба данных идет на http-сервер), и я хотел бы издеваться над его поведением.mocking dataservice with bard js

Я издеваюсь над библиотекой под названием bard js, и у нее есть api для издевательства сервисов под названием bard.mockService.

В заявлении beforeEach я делаю:

beforeEach(function() { 
    bard.appModule('app.process.creation'); 
    bard.inject('$controller', '$rootScope', '$q', 'processCreationDataservice'); 

    bard.mockService(processCreationDataservice, { 
     createProcess: $q.when({}), 
     _default: $q.when([]) 
    }); 

    controller = $controller('ProcessCreationController'); 
    $rootScope.$apply(); 
}); 

тогда мой тест:

it('should call create process data service to create process', function() { 
    controller.create(); 
    expect(processCreationDataservice.createProcess).to.have.been.calledOnce; 
}); 

Как вы можете видеть в тесте я хочу утверждать, что dataservice.createProcess вызывается один раз ,

Контроллер не вызывает метод processCreationDataservice.createProcess и все еще проходит тест.

(function() { 
angular 
    .module('app.process.creation') 
    .controller('ProcessCreationController', ProcessCreationController); 

ProcessCreationController.$inject = ['processCreationDataservice']; 

function ProcessCreationController(processCreationDataservice) { 
    var vm = this; 

    vm.process = { 
     name: '', 
     bankId: '' 
    }; 

    vm.create = function() { 

    }; 
}})(); 

Я хотел бы знать, почему этот тест проходит, и что я должен делать, чтобы утверждать, что метод вызывается один раз.

я следовал этим инструкциям: https://github.com/wardbell/bardjs#mockService

ответ

4

Я считаю, что вы пренебрегли загрузкой скрипта sinon-chai. Вы можете быстро узнать, вставив его в вашем specs.html чуть ниже, где вы загружаете sinon.js

<script src="https://rawgithub.com/domenic/sinon-chai/master/lib/sinon-chai.js"></script> 

Я обычно тянут вниз Sinon-Chai через НПМ

npm install sinon-chai --save-dev 

, а затем мой сценарий становится ...

<script src="/node_modules/sinon-chai/lib/sinon-chai.js"></script> 

Держу пари, что ваш тест терпит неудачу, как и следовало ожидать.

Пропуск Sinon-Chai приводит к очень тонкий ложный положительный результат. Следуйте за мной, как я объясняю:

Давайте посмотрим на утверждение/ожидание просто прежде чем сказать «calledOnce»:

expect(processCreationDataservice.createProcess).to.have.been; // Assertion 

Он возвращает Chai Assertion. Но что Assertion объект не имеет всех методов утверждения синонов таких как calledOnce.Библиотека sinon-chai распространяет chai с помощью методов утверждения синонов.

Итак, когда вы лавировать calledOnce до конца, вы получите:

expect(processCreationDataservice.createProcess).to.have.been.calledOnce; // undefined 

Yup, оператор возвращает undefined ... который является инертным утверждение не имеет никакого значения для мокко. Это не ошибка. Это просто нет. Таким образом, expect ничего не делает, и мокка думает, что тест прошел.

Вы, возможно, также сделали это (она проходит слишком):

expect(processCreationDataservice.foo /*undefined*/).to.have.been.calledOnce; // undefined 

Вы не должны использовать "Sinon-ЧАЙ". Это удобство. Но если вы оставите его, вы должны будете написать ожидание так:

// without "sinon-chai" 
    expect(dataservice.createThing.calledOnce).to.be.true; 

Я создал a plunker для вас (и другие), чтобы исследовать эту динамику.

+0

Да, это было так. Не заметил, что скрипт не загружается. Большое спасибо! – Daniel

+0

@ В случае, если вы хотите загрузить модуль как зависимость ex: bard.appModule ('coreModule', ['utilityModule']), вам нужно идентифицировать зависимость как свой собственный модуль перед началом работы? Или сделать дополнительные ссылки на него? – Winnemucca

-3

Это не совсем ответ, я не думаю, просто вопрос. Зачем вам привлекать стороннего участника http mock service, когда угловой $httpBackend встроенный? Если это было сознательное решение, что заставило вас пойти на это?

+1

Потому что я хотел бы высмеять поведение службы данных, так как я тестирую контроллер. Контроллер имеет зависимость от службы данных, а не $ http. Когда мне нужно протестировать службу данных, которая имеет зависимость от $ http, тогда я буду использовать $ httpBackend – Daniel