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

时间:2019-10-21 05:20:13

标签: javascript node.js typescript jestjs

我尝试编写包装在类中的测试用例,以便调用方法将执行测试用例。但是由于依赖关系,URL值将在beforeAll / beforeEach块内初始化。在那种情况下,我没有得到url值,这导致测试用例执行失败。我也无法将url作为参数传递(URL仅在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(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();
  });
});

1 个答案:

答案 0 :(得分:1)

原因是代码的执行顺序。

关键是beforeAll函数在调用it之前而不是在调用sample.sampleTestFunction()之前执行。因此,当您调用sample.sampleTestFunction()方法时,sample.args = <TestCaseArgumentsType>{ url: 'sampleUrl' }函数内的语句beforeAll将不会执行。 arguments的{​​{1}}属性是sample。这就是为什么您会出错:

  

TypeError:无法读取未定义的属性“ url”

undefined测试运行程序准备调用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。对不起,我的英语。