微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在nodejs中对代码进行单元测试?

如何解决如何在nodejs中对代码进行单元测试?

我在下面的代码添加了几个参数。现在我想检查这个添加是否正确执行。下面是我的代码

"use strict";

const account = require('account');
async function main() {
  try {
    //calling an API to get data
    const mainData = await account.getData();
    const data = platformEarnings.data.items;
    const first_value =
      data[i].first_value != undefined
        ? data[i].first_value.split("@")[1]
        : "0.00";
    const second_value =
      data[i].second_value != undefined
        ? data[i].second_value.split("@")[1]
        : "0.00";
    const total_value = parseFloat(first_value) + parseFloat(second_value);
    return true;
  } catch (e) {
    logger.error("Error - [%s]",e);
    return false;
  }
}
module.exports = main;

我尝试的测试如下,

'use strict';

const { expect } = require('chai');
require('app-module-path').addpath('./src');
const axios = require('axios');
const sinon = require('sinon');
let axiosstub;

describe('Tests',() => {
  function resetSinon() {
    axiosstub.restore();
    axiosstub.reset();
    sinon.restore();
    sinon.reset();
  }

  context('when appropriate data is returned',() => {
    let result;
    before(async () => {
      axiosstub = sinon.stub(axios,'request').callsFake((req) => {
          data = { data: {} };
          data.data = {items: [{
            first_value: '@100.00',second_value: '@100.00',}]
        };
        return data;
      });
      let testData = require('main');
      result = await testData();
    });

    after(() => {
      resetSinon();
    });

    it('should calculate correct value',async () => {
      data.data.items.forEach((items) => {
        let first_value = '0.00';
        let second_value = '0.00';
        if (items.first_value.includes('@')){
            first_value = items.first_value.split('@')[1]
        }
        if (items.second_value.includes('@')){
          second_value = items.second_value.split('@')[1]
        }
        const total_value = parseFloat(first_value) + parseFloat(second_value)
        expect(total_value).to.equal(200)
      });
    });
  });
});

在上面的测试中,我在测试中添加 first_value 和 second_value 并在下一行进行比较。但我想改变这一点,我应该能够检查实际代码中的添加是否正是我所期望的,而不仅仅是在测试用例中添加它。或者也许我写错了测试用例。让我知道如何按照我的期望进行此测试。

我是 NodeJS 中的单元测试新手,因此不胜感激。

解决方法

您应该从 main 中提取要进行单元测试的业务逻辑。 像这样

"use strict";

const account = require('account');

function computeTotalValue(data){
    const first_value =
      data.first_value != undefined
        ? data.first_value.split("@")[1]
        : "0.00";
    const second_value =
      data.second_value != undefined
        ? data.second_value.split("@")[1]
        : "0.00";
    const total_value = parseFloat(first_value) + parseFloat(second_value);
    return total_value;
}

async function main() {
  try {
    //calling an API to get data
    const mainData = await account.getData();
    const data = platformEarnings.data.items;
    const total_value = computeTotalValue(data[i]);
    return true;
  } catch (e) {
    logger.error("Error - [%s]",e);
    return false;
  }
}
module.exports = { main,computeTotalValue };

既然业务逻辑在自己的功能里,就可以测试一下了:

'use strict';

const { expect } = require('chai');
require('app-module-path').addPath('./src');
const axios = require('axios');
const sinon = require('sinon');
let axiosStub;

describe('Tests',() => {
  function resetSinon() {
    axiosStub.restore();
    axiosStub.reset();
    sinon.restore();
    sinon.reset();
  }

  context('when appropriate data is returned',() => {
    let result;
    before(async () => {
      axiosStub = sinon.stub(axios,'request').callsFake((req) => {
          data = { data: {} };
          data.data = {items: [{
            first_value: '@100.00',second_value: '@100.00',}]
        };
        return data;
      });
    });

    after(() => {
      resetSinon();
    });

    it('should calculate correct value',async () => {
      let testData = require('main');
      data.data.items.forEach((items) => {
        const total_value = testData.computeTotalValue(items);
        expect(total_value).to.equal(200)
      });
    });
  });
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?