一种在 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.ts
和 example2-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);
});
});
}
我正在使用 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.ts
和 example2-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);
});
});
}