简体   繁体   English

如何在 JS 单元测试中模拟静态变量?

[英]How can I mock a static variable in JS unit test?

In the karma coverage test, I got 99.3% coverage.在业力覆盖率测试中,我得到了 99.3% 的覆盖率。 In order to make it 100%, I need help for testing the else part in this function:为了使其 100%,我需要帮助来测试此函数中的 else 部分:

createCurrencyUnits(): void {
var keys = Object.keys(ObjectsDomainConstants.CURRENCY_UNITS);
for (var i = 0; i < keys.length; i++) {
  if (ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].base_unit === null) {
    // Base unit (like: rupees, dollar etc.).
    createUnit(ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].name, {
      aliases: ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].aliases});
  } else {
    // Sub unit (like: paise, cents etc.).
    createUnit(ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].name, { //<--red line at here
      definition: ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].base_unit,
      aliases: ObjectsDomainConstants.CURRENCY_UNITS[keys[i]].aliases});
  }
}

A small hint is to mock/override the CURRENCY_UNITS in the test.一个小提示是在测试中模拟/覆盖 CURRENCY_UNITS。 You may want to use the function/variable below:您可能想要使用下面的函数/变量:

fromRawInputString(units: any): Units {
  try {
    this.createCurrencyUnits(); //<-- you can see this function call createCurrencyUnits()
  } catch (parsingError) {}
var compatibleUnits = this.toMathjsCompatibleString(units);
if (compatibleUnits !== '') {
  try {
    unit(compatibleUnits);
  } catch (err) {
    throw new Error(err);
  }
}
return new Units(this.fromStringToList(units));}

And this is the CURRENCY_UNITS:这是 CURRENCY_UNITS:

public static CURRENCY_UNITS = {
dollar: {
  name: 'dollar',
  aliases: ['$', 'dollars', 'Dollars', 'Dollar', 'USD'],
  front_units: ['$'],
  base_unit: null
},
rupee: {
  name: 'rupee',
  aliases: ['Rs', 'rupees', '₹', 'Rupees', 'Rupee'],
  front_units: ['Rs ', '₹'],
  base_unit: null
},
cent: {
  name: 'cent',
  aliases: ['cents', 'Cents', 'Cent'],
  front_units: [],
  base_unit: '0.01 dollar'
},
paise: {
  name: 'paise',
  aliases: ['paisa', 'Paise', 'Paisa'],
  front_units: [],
  base_unit: '0.01 rupee'
}};

And here is the code that I tried to test, but still doesn't work:这是我尝试测试的代码,但仍然无法正常工作:

it('should test the CURRENCY_UNITS', () => {
  ObjectsDomainConstants.CURRENCY_UNITS.cent.base_unit = '0.03 dollar';
  ObjectsDomainConstants.CURRENCY_UNITS.paise.base_unit = '0.02 rupee';
  expect(units.fromRawInputString('cent').toDict()).toEqual(
    new Units([{exponent: 1, unit: 'cent'}]).toDict());
  expect(units.fromRawInputString('paise').toDict()).toEqual(
    new Units([{exponent: 1, unit: 'paise'}]).toDict());
  ObjectsDomainConstants.CURRENCY_UNITS.cent.base_unit = '0.01 dollar';
  ObjectsDomainConstants.CURRENCY_UNITS.paise.base_unit = '0.01 rupee';
});

for those who want to know the answer that I just figure out, you can see here:对于那些想知道我刚刚弄清楚的答案的人,你可以在这里看到:

it('should test the CURRENCY_UNITS if the base unit is not null', () => {
  ObjectsDomainConstants.CURRENCY_UNITS.dollar.base_unit = '100 cent';
  expect(units.fromRawInputString('dollar').toDict()).toEqual(
    new Units([{exponent: 1, unit: 'dollar'}]).toDict());
});

it('should test the CURRENCY_UNITS if the base unit is null', () => {
  ObjectsDomainConstants.CURRENCY_UNITS.dollar.base_unit = null;
  expect(units.fromRawInputString('dollar').toDict()).toEqual(
    new Units([{exponent: 1, unit: 'dollar'}]).toDict());
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM