首页 > 解决方案 > 使用 mocha 在类中测试函数中的变量

问题描述

我需要在 TASK 类的 pullPackage() 函数中测试 url 变量的值。

class TASK {
  constructor(taskData, done) {
    //some code
  }

  // Generic Setup

  pullPackage() {
    return new Promise((resolve, reject) => {
      fs.emptydir(this.taskDir, (err) => {
        if (err) return reject(err);
        const git = require('simple-git')(this.taskDir);

        let url = '';
        console.log(process.env.NODE_ENV);
        if (process.env.NODE_ENV === 'test') {
          // url = 'ssh://testuser@127.0.0.1:4000/testuser/test-repo-1.git'; // make this match the below format
          url = '/git/testuser/test-repo-1';
        } else {
          const gitAddress = new URL(config.config.GIT_ADDRESS);
          url = `${gitAddress.protocol}//runner:${this.taskData.gitJWT}@${gitAddress.hostname}:${gitAddress.port}${this.taskData.repo}.git`;
        }
        // console.log(url);
        // const url = `${gitAddress.protocol}//runner:${this.taskData.gitJWT}@${gitAddress.hostname}:${gitAddress.port}${this.taskData.repo}.git`;
        this.logger.log('Cloning from', url);
        return git.clone(url, 'repo', (cloneErr) => {
          if (cloneErr) return reject(cloneErr);
          // console.log(url);
          // console.log(resolve);
          return resolve(true);
        });
      });
    });
  }
}

我正在使用 Mocha 和 Chai 来执行此操作。我对这个函数有两个测试,检查变量和承诺。第二个测试按预期运行,但第一个总是返回失败,并显示AssertionError: expected undefined not to be undefined. 我认为问题在于我在测试期间如何访问变量。目前我正在这样做:我这样做expect(result.url).to.not.be.undefined;正确吗?

describe('Test MenloLab Runner - Task Class', () => {
  describe('Pull Package', () => {
    it('Check URL constant.', () => task.pullPackage().then((result) => {
      expect(result.url).to.not.be.undefined; // adjust the access method
    }));

    it('It should pull package from GIT.', () => task.pullPackage().then((result) => {
      expect(result).to.be.true;
    }));
  });
});

标签: javascriptunit-testingmocha.jschai

解决方案


检查 URL 的解决方法可以通过监视git.clone方法来完成。为此,我们需要使用Sinon

我没有用你的代码测试过,但我给你一个关于以下解决方案的线索:

const sinon = require('sinon');
const git = require('simple-git');

describe('Test MenloLab Runner - Task Class', () => {
  describe('Pull Package', () => {
    it('Check URL constant.', () => {
      return task.pullPackage().then((result) => {
        sinon.spy(git, 'clone'); // spying on git.clone method

        expect(result.url).to.not.be.undefined; // adjust the access method

        const expectedUrl = 'my-expected-not-undefined-url';
        sinon.assertCalledWith(git.clone, expectedUrl); // we check whether git.clone is called with not undefined URL
       });
    });

    it('It should pull package from GIT.', () => task.pullPackage().then((result) => {
      expect(result).to.be.true;
    }));
  });
});

希望能帮助到你


推荐阅读