【问题标题】:Sinon and mocking default propertiesSinon 和模拟默认属性
【发布时间】:2019-05-22 11:37:56
【问题描述】:

假设我有以下文件/代码:

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
   }; 
}

格式化程序.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 的所有默认属性,而不是覆盖的值。

我错过了什么?我做错了什么?

【问题讨论】:

    标签: javascript typescript sinon


    【解决方案1】:

    我最终不得不使用ts-mock-imports,因为我使用的是 webpack。谢谢!

    【讨论】:

      【解决方案2】:

      只有诗侬无法满足您的所有要求。您需要一些工具来模拟您的导入,例如 Jest 中的 genMockFromModuleproxyquire

      Sinon 是一种非常方便的生成存根的方法,但该工具对您的模块结构一无所知。您应该找到一种方法,将您的 Sinon 模拟类传递给您正在测试的模块。

      【讨论】:

        猜你喜欢
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 2019-10-23
        • 2015-09-09
        相关资源
        最近更新 更多