一种在 beforeEach 中初始化变量并进一步使用它的方法 - Mocha

A way to initialize variable in beforeEach and use it further - Mocha

我正在使用 Mocha、Typescript 和 Cypress 编写测试。
这是我想要实现的目标的可视化(到目前为止没有成功:():

// this is in example-spec.ts file
context('Sharing variable test', function() {
  let ctx: string;

  beforeEach(function() {
    ctx = 'Value given in beforeEach';
  });

  console.log(ctx); // prints undefined
  consumeCtx(ctx);
});

// this is in separate example-template.ts file
export function consumeCtx(ctx: string) {
    console.log(ctx); // this is undefined
    // use ctx here
    describe('Testing my stuff', function () {
        it('should do something', function () {
          // use ctx here  
          cy.log('This is a test');
        });
      });
}

我希望我能以某种方式在 beforeEach 中填充 ctx 数据,然后通过调用接受 ctx 作为参数的函数来使用它。
这个想法是有 2 个不同的规范文件(例如 example1-spec.tsexample2-spec.ts),它们可以分别是 运行。
但它们仍然共享 example-template.ts 文件中定义的相同测试逻辑。
并且在spec文件中提供了特定于每个spec文件的测试数据ctx,然后将其传递给模板文件中的公共测试逻辑。
有没有办法在我创建的设置中实现此目的?
我的方法是完全错误的吗?你会怎么做更好?
谢谢!

[编辑] 这就是我根据答案重新组织它的方式:

每个spec文件中都有mocha结构。

context('Voucher tests', function () {
    let ctx: string;

    beforeEach(function () {
        ctx = 'Value given in beforeEach';
        cy.wrap(ctx).as('ctx');
    });

    describe('Logged in user', function () {
        it('valid voucher ', function () {
            cy.get<string>('@ctx').then((ctx) => {
                console.log(ctx); // should print the value of ctx now
                validCtxTest(ctx);
            });
        });

        it('invalid voucher ', function () {
            cy.get<string>('@ctx').then((ctx) => {
                console.log(ctx); // should print the value of ctx now
                invalidCtxTest(ctx);
            });
        });
    });
});  

在单独的模板文件中我有共享逻辑。

export function validCtxTest(ctx: string) {
  cy.log('Logic for valid test', ctx);
}

export function invalidCtxTest(ctx: string) {
  cy.log('Logic for invalid test', ctx);
}  

我很难学到这一点。但是您需要包装 ctx,提供一个别名,然后调用该别名以传递给您的函数。 我不是一个类型脚本的人,但希望这会有所帮助。 [编辑:添加工作脚本和结果]

context("blah",()=> {
    let ctx
    beforeEach( function()  {
        const uuid = () => Cypress._.random(0, 1e3)
        const id = uuid()
        ctx=`some random number ${id}`
        cy.wrap(ctx).as('ctx')
        
    })
    describe("Spec", () => {
        
        it("Test1", function()  {
            cy.get('@ctx').then(ctx=> {
                console.log(ctx)
            })
            
        })
    
        it("Test2", function()  {
            cy.get('@ctx').then(ctx=> {
                console.log(ctx)
            })
        })
    })
})

此外,如果您不打算在一个 spec 文件中进行多个测试,或者在 1 个 spec 文件下为每个测试传递不同的 ctx 值,那么只需忽略 Before 挂钩。您可以在测试中声明一个变量,然后将其包装起来并在该测试中您想要的任何地方调用它。对于下一个测试,请执行相同的操作。 它与我在项目中使用的方法相同。 fixtures 在定义和传递测试数据方面有很大帮助,而不是变量。

您混合使用了同步代码和异步代码。调用顺序与您预期的测试顺序不同。

consumeCtx 收到 ctx 的初始值,因为它在 beforeEach() 之前运行。

要在函数内部获取 ctx 的值,请使用来自 this 的别名和引用。

测试

import { consumeCtx } from '../support/consumeCtx'

context('Sharing variable test', function() {

  beforeEach(function() {
    const ctx = 'Value given in beforeEach';
    cy.wrap(ctx).as('ctx')
  });

  consumeCtx();
});

函数

export function consumeCtx() {
  describe('Testing my stuff', function () {
    it('should do something', function () {
      cy.log('This is a test: ', this.ctx);
    });
  });
}