JEST:函数内的测试用例不从构造函数获取值



我尝试编写包装在类中的测试用例,以便调用方法将执行测试用例。但是由于依赖因素,url 值将在 beforeAll/beforeEach 块内初始化。在这种情况下,我没有获得 url 值,这会导致测试用例执行失败。我也无法将 url 作为参数传递(url 只会在 beforeAll 块中初始化(。有没有其他的灵魂可以解决这个问题?

样本测试.ts

export interface TestCaseArgumentsType {
baseUrl: string;
url: string;
}
export class Sample {
set args(value: TestCaseArgumentsType) {
this.arguments = value;
}
private arguments!: TestCaseArgumentsType;
sampleTestFunction() {
console.log(this.arguments.url); // **expected**: sampleUrl **actual**: cannot set property url of undefined
it('to check the before each execution effects in the test case', () => {
console.log(this.arguments.url); // sampleUrl
});
}
}

sampleTestSuite.test.ts

import { Sample, TestCaseArgumentsType } from './sampleTest';
describe('User Route', () => {
let sample = new Sample();
// Test suite
describe('GET Request', () => {
// Preparing Test Suite
beforeAll(async () => {
sample.args = <TestCaseArgumentsType>{ url: `sampleUrl` };
}, 20000);
// Executing
sample.sampleTestFunction();
});
});

原因是代码的执行顺序。

关键点是beforeAll函数是在调用it之前执行的,而不是在调用sample.sampleTestFunction()之前执行的。因此,当您调用sample.sampleTestFunction()方法时,beforeAll函数内部sample.args = <TestCaseArgumentsType>{ url: 'sampleUrl' }语句将不会执行。samplearguments属性是undefined。这就是您收到错误的原因:

类型错误: 无法读取未定义的属性"url">

jestjs测试运行程序准备调用it时,测试运行程序将首先调用beforeAll函数

sampleTest.ts

export interface TestCaseArgumentsType {
baseUrl: string;
url: string;
}
export class Sample {
set args(value: TestCaseArgumentsType) {
this.arguments = value;
}
private arguments!: TestCaseArgumentsType;
sampleTestFunction() {
console.log('===execute 2===');
console.log(this.arguments.url); // another sampleUrl
it('to check the before each execution effects in the test case', () => {
console.log('===execute 4===');
console.log(this.arguments.url); // sampleUrl
});
}
}

sampleTestSuite.test.ts

import { Sample, TestCaseArgumentsType } from './sampleTest';
describe('User Route', () => {
let sample = new Sample();
describe('GET Request', () => {
console.log('===execute 1===');
sample.args = <TestCaseArgumentsType>{ url: `another sampleUrl` };
beforeAll(async () => {
console.log('===execute 3===');
sample.args = <TestCaseArgumentsType>{ url: `sampleUrl` };
}, 20000);
sample.sampleTestFunction();
});
});

单元测试结果:

PASS  src/stackoverflow/58480169/sampleTestSuite.test.ts (7.092s)
User Route
GET Request
✓ to check the before each execution effects in the test case (3ms)
console.log src/stackoverflow/58480169/sampleTestSuite.test.ts:8
===execute 1===
console.log src/stackoverflow/58480169/sampleTest.ts:11
===execute 2===
console.log src/stackoverflow/58480169/sampleTest.ts:12
another sampleUrl
console.log src/stackoverflow/58480169/sampleTestSuite.test.ts:11
===execute 3===
console.log src/stackoverflow/58480169/sampleTest.ts:15
===execute 4===
console.log src/stackoverflow/58480169/sampleTest.ts:16
sampleUrl
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.89s

如您所见,我放置了一些console.log来指示代码的执行顺序。执行顺序为1,2,3,4。对不起我的英语。

最新更新