Раздражение с Sinon.js зависимости, которая будет введена - PullRequest
0 голосов
/ 20 сентября 2018

Имеет следующий файл balanceRepository.js.

module.exports = function(){
this.getBalance = (accountId)=>{
    throw 'NotImplementedException';
};};

и файл сервиса TransactionsService.js.

module.exports = function(balanceRepo){
this.isTransactionAllowed = (amount, accountId)=>{
    const balance = balanceRepo.getBalance(accountId);
    return amount <= balance;
};};

Я хотел бы провести модульное тестирование, когда мы вызываем транзакциюService.isTransactionAllowed., он будет вызывать внутренне к balanceRepository.getBalance.Я ожидал, что следующий код будет работать.

let BalanceRepository = require('../balanceRepository');
let TransactionService = require('../transactionService');

let should = require('should');
let sinon = require('sinon');

describe('transaction service', ()=>{
   let fakeBalanceRepo = sinon.spy(BalanceRepository);
   let transactionSrv = new TransactionService(fakeBalanceRepo);

   transactionSrv.isTransactionAllowed(100, 987654321);

   it('should call getBalance', ()=>{
      fakeBalanceRepo.getBalance.should.be.called();
});});

Я создаю шпион класса BalanceRepository.Я внедряю этот шпионский объект в мою реальную реализацию TransactionService.Затем я утверждаю, что метод getBalance вызывается у шпиона.Это имеет смысл для меня, но это не работает !!

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Это работает, как прокомментировал Estus.

let balanceRepo = new BalanceRepository();
let fakeGetBalance = sinon.stub(balanceRepo, 'getBalance');

let transactionSrv = new TransactionService(balanceRepo);
transactionSrv.isTransactionAllowed(100, 987654321);

it('should call getBalance', ()=>{
    fakeGetBalance.should.be.called();
});
0 голосов
/ 20 сентября 2018

sinon.spy(BalanceRepository) не означает, что методы класса будут автоматически отслеживаться (они не будут).

TransactionService ожидает BalanceRepository экземпляр, в то время как fakeBalanceRepo является конструктором.

Если цель состоит в том, чтобы шпионить за методом класса и не изменять его поведение, это:

   let balanceRepo = new BalanceRepository;
   sinon.spy(balanceRepo, 'isTransactionAllowed')
   let transactionSrv = new TransactionService(balanceRepo);
   transactionSrv.isTransactionAllowed(100, 987654321);
   balanceRepo.getBalance.should.be.called();
...