当前位置: 首页 > 知识库问答 >
问题:

每次测试前是否在摩卡套件中设置变量?

贺博厚
2023-03-14

我想先设置一些变量,在执行测试之前,我找到了这个解决方案,在每个套件之前运行摩卡设置,而不是在每次测试之前

但是,我不知道如何才能传递变量到我的回调,他们的方式我做了我会得到未定义

makeSuite('hello', (context) => {
    it('should return', () => {
        assert.strictEqual(1, 1)
    })
})
makeSuite('world', (context) => {
    it('should return', () => {
        console.log(context) // undefined
        assert.strictEqual(1, 1)
    })
})

function makeSuite(name: string, cb: (context: any) => any) {
    let age: string;
    describe(name, () => {
        beforeEach(() => {
            age = '123'
        })

        cb(age);
    })
}

我之所以要将变量传递到回调中,是因为,我将有许多私有变量需要设置在beFore每个钩子,并且我不想重复所有测试的代码

共有3个答案

穆承运
2023-03-14

我从路易斯正在做的事情开始,但后来发现(在我的情况下)围绕它做函数更好。这样,我就可以切换动作后和动作前。我还需要之前,之后,它是异步的。

function itWithSetup(name, callback, doBefore = true, doAfter = true) {

  let context = null;
  if (doBefore) {
    before(async () => {
     context = await getContext();
    });
  }
  it(name, async () => {
    await callback(context);
  });
  if (doAfter) {
    after(async () => {
      await clearContext();
    });
  }
}

describe("test with context", () => {

  itWithSetup("unit test", async (message) => {

    await testWithContext(context, otherConditions);

  }, true, true);
});
徐文彬
2023-03-14

还有另一种方法,就是将变量注入mocha上下文中

makeSuite('world', function() {
    it('should return', function() {
        // read the variable as shown below
        console.log((this as any).age); // 123
    })
})

function makeSuite(name: string, cb: () => any) {
    describe(name, function() {
        beforeEach(function() {
            // inject the desired variable into the mocha context
            (this as any).age = 123;
        })

        cb();
    })
}

但是,我不认为将变量注入摩卡上下文是一个好的做法,@Louis提供的答案将是更好的解决方案

聂鹏云
2023-03-14

传递给descripe的回调会立即调用,但是在每个之前的钩子会在稍后执行测试时调用。因此,当调用cb(age)时,age具有值undefinedage稍后设置为“123”,但cb已提前获取其值副本,因此无效。为了让cb看到更改,您必须向对象传递一个引用,然后对该对象进行变异。大概是这样的:

makeSuite('world', (context) => {
    it('should return', () => {
        console.log(context.age)
    })
})

function makeSuite(name, cb) {
    describe(name, () => {
        let context = {
            age: undefined,
        };
        beforeEach(() => {
            context.age = '123';
        });

        cb(context);
    });
}

(我已经删除了TypeScript类型注释,以便它作为纯JavaScript运行。无论如何,注释对解决问题并不重要。)

 类似资料:
  • 我正在尝试使用sinon的mock and spy来测试Redux组件和异步操作,但只要我将sinon导入任何测试文件,就会运行以下npm脚本: mocha -要求测试/助手/浏览器. js -编译器。:babel-core/register-opts test/client/* */*{js,jsx} -递归测试/客户端 我得到以下错误: 类型错误: document.createElement

  • 我正在使用node.js和摩卡单元测试,我希望能够通过npm运行测试命令。当我在测试文件夹中运行摩卡测试时,测试成功运行。但是,当我运行npm测试时,测试给我一个错误。 下面是我的package.json的一个片段: 有人知道为什么npm测试会给我一个错误,但是mocha测试运行正常吗? 谢谢

  • 我正在尝试从请求模块测试GET HTTP方法: 下面是我如何测试 部分的: 但是,我没有找到测试catch部分的方法(当它给出错误并且响应状态不是>=400)。 有什么建议吗? 它也将帮助我解决这个问题,一个简单的例子,另一个代码测试一个承诺的catch部分。

  • 我正在使用mocha和chai对AngularJS服务执行一些单元测试。该服务具有不同的功能,每个功能都返回一个promise。 我面临的问题是,测试不是在断言之前等待promise值得到解决。我知道做()回调可以用摩卡。所以,我试着用它。但这也给了我一个错误。这是代码: 因此,现在的问题是测试没有失败(它应该失败)。相反,它只是超时并给我一个错误:“超时超过2000ms。请确保在此测试中调用了d

  • 我必须在开玩笑的每个测试文件之前做一个异步设置(特别是每次启动一个MongoMemoryServer)。 使用setupFiles不工作,因为不处理异步工作。传递全局Promise不起作用,因为我必须在需要我的db模块之前设置db uri字符串(我不想在等待Promise后嘲笑它,那很糟糕)。 官方指南使用并使用设置mongo服务器。奇怪的是,医生说 注意:测试环境是沙盒。每个测试套件将在其自己的

  • 问题内容: Mocha尝试在默认情况下查找测试文件,如何指定另一个目录,例如? 问题答案: 编辑:不建议使用此选项:https://mochajs.org/#mochaopts 如果要通过仍然仅在命令行上运行但要在文件夹而不是中运行测试来执行此操作,请在文件中创建一个文件,其中包含以下内容: 如果要运行该文件夹和子目录中的所有内容,请将其放入 是通过命令行传递的参数,因此使第一行也就是您要更改测试