Синон и насмешливые свойства по умолчанию - PullRequest
1 голос
/ 22 мая 2019

Допустим, у меня есть следующие файлы / код:

Person.ts

export class Person {
    id: string;
    firstName: string;
    lastName: string;
    isEmployed: boolean = true;
    isManager: boolean = false;

    public static Name = ():string => this.firstName + ' ' + this.lastName;
}

WorkHistory.ts

import { Person } from './person';

export class WorkHistory {
   public propA: string;
   public propB: string;

   public getHistory = (p: Person): any => { 
      // do something
      // return history
   }; 
}

Formatter.ts

import { Person } from './person';
import { WorkHistory } from './workHistory';

export class Formatter {
   public formatWork(p: Person) {
       let wh: WorkHistory = new WorkHistory();
       let whData = wh.getHistory(p);

       // do formatting
       // return formatting
   }
}

Я пытаюсь написать модульный тест для метода formatWork. Однако я не могу понять, как заглушить WorkHistory и его свойства.

Вот что у меня так далеко:

Formatter.spec.ts

describe('formatWork', () => {
   let mockWorkHistory = {
      propA: '',
      propB: ''
   };
   let sandbox;
   let formatter;

   beforeEach(() => {
      sandbox = sinon.createSandbox();
      sandbox.stub(WorkHistory, "prototype").value(mockWorkHistory);
   });

   afterEach(() => {
      sandbox.restore();
   });

   it('should do something', () => {
       // create person object
       formatter = new Formatter();
       var result = formatter.formatWork(person);

       console.log(result);
   });
});

Я пробовал заглушки и sandbox.replace, однако я не могу перезаписать WorkHistory свойства или методы по умолчанию.

В нынешнем виде вышесказанное создает исключение в Phantom 2.1.1:
TypeError: Attempting to change enumerable attribute of unconfigurable property.

Кроме того, console.log в моем приборе показывает все свойства по умолчанию для WorkHistory вместо перезаписанных значений.

Что мне не хватает? Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Мне пришлось использовать ts-mock-imports, так как я использовал веб-пакет. Спасибо!

0 голосов
/ 22 мая 2019

Sinon не может удовлетворить все ваши требования. Вам нужны инструменты для насмешки при импорте, например genMockFromModule в Jest или proxyquire

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

...