Typescript中Cucumber测试类间动态传值出现undefined问题求助
问题原因
你在YYY类里新建了一个XXX实例,这个实例和执行Given I set some value步骤的XXX实例是完全独立的两个对象——前者从未执行过getInfoData()方法,自然searchedValue会是undefined。
解决方案
方案1:用Cucumber共享上下文(World)传递实例(推荐)
Cucumber提供了World机制来共享测试上下文,让所有步骤类共用同一个实例:
1. 定义自定义World
import { setWorldConstructor } from '@cucumber/cucumber'; import { XXX } from './xxx'; class TestWorld { xxxInstance: XXX; constructor() { this.xxxInstance = new XXX(); } } setWorldConstructor(TestWorld);
2. 修改XXX类的步骤方法
import { Given } from '@cucumber/cucumber'; import { TestWorld } from './test-world'; export class XXX { searchedValue: string; @given("I set some value") public async getInfoData(this: TestWorld){ // 操作World里的共享XXX实例 this.xxxInstance.searchedValue = await getData.getPlayersId(); } }
3. 修改YYY类的步骤方法
import { Then } from '@cucumber/cucumber'; import { TestWorld } from './test-world'; export class YYY { @then("I print it") public async showData(this: TestWorld){ // 直接从World获取已赋值的实例 console.log(this.xxxInstance.searchedValue); // 注意:searchedValue是字符串,不需要await } }
方案2:用全局存储对象传递数据(适合小型项目)
如果项目规模小,也可以用一个全局对象来存储共享数据:
1. 创建全局存储文件
// test-context.ts export const testContext = { searchedValue: '' };
2. 修改XXX类
import { given } from '@cucumber/cucumber'; import { testContext } from './test-context'; export class XXX { @given("I set some value") public async getInfoData(){ testContext.searchedValue = await getData.getPlayersId(); } }
3. 修改YYY类
import { then } from '@cucumber/cucumber'; import { testContext } from './test-context'; export class YYY { @then("I print it") public async showData(){ console.log(testContext.searchedValue); } }
额外注意
- 你之前写的
await xxx.searchedValue是多余的:searchedValue是字符串类型,不是Promise,不需要用await。 - 确保你的
@cucumber/cucumber版本在v7及以上,才能支持World构造器功能。
内容的提问来源于stack exchange,提问作者EdXX
相关产品推荐
相关产品推荐

