从另一个助手调用助手:`this` 未定义

时间:2021-02-05 10:42:54

标签: codeceptjs

我遇到了从另一个助手调用助手的问题。 这可能是我对概念的误解,但我没有在文档中找到任何答案。

在我的项目中,我经常使用助手。其中一些非常简单,可以帮助我完成诸如从自定义选择 ui 元素中选择项目之类的事情。其他的要大得多 - 例如,我有一个助手可以创建整个课程实体(对于特定的测试场景,我需要一些具有不同数据的课程)。 问题是当我直接从场景中调用我的助手时,我可以在其中使用 Puppeteer,但是当我从另一个助手调用助手时 - 无法使用 Puppeteer,因为 this 变量返回 undefined ,所以我不能调用 this.helpers.Puppeteer

这是简化的代码。

两个助手声明:

exports.config = {
  helpers: {
    Puppeteer: { /* some config */ },
    SelectFromListHelper: {
      require: './selectFromList_helper.js' // <- this one is "simple" helper
    },
    CreateLessonHelper: {
      require: './createLesson_helper.js' // <- this one is "big one" - has to be working with other helerps
    }
  },
  bootstrap: null
}

SelectFromListHelper:

class SelectFromListHelper extends Helper {
  async selectFromList (selector, listItemNumber = 1) {
    // const page = this.helpers['Puppeteer'].page
    // await page.click('#list')

    console.log(this)
  }
}

创建课程助手:

class CreateLessonHelper extends Helper {
  async createLesson () {
    const page = this.helpers['Puppeteer'].page
    // await page.click('#assistants')

    const { selectFromList } = this.helpers.SelectFromListHelper
    await selectFromList('#teachers', 2)
  }
}

场景:

Feature('Feature 1')
Scenario('Test 1', async ({ I}) => {
    // calling for SelectFromListHelper.selectFromList
    // it works fine, puppeteer is accessible from that function. (console.log returns helper object)
    await I.selectFromList('#assistants', 1)
    
    // calling for CreateLessonHelper.createLesson
    await I.createLesson()
    // and here the problem starts.
    // Inside of createLesson I do call this.helpers.SelectFromListHelper.selectFromList()
    // and from that call i can't access the Puppeteer. Console.log returns "undefined"
})

如果我在 selectFromList 方法中删除 console.log 并取消注释 Puppeteer 调用,我会收到以下反馈:

--verbose
CodeceptJS v3.0.4
Using test root "C:\Work\london-smp-tests"
Helpers: Puppeteer, SelectFromListHelper, CreateLessonHelper
Plugins: screenshotOnFail

Feature 1 --
    [1]  Starting recording promises
 » [Session] Starting singleton browser session
  Test 1
    I select from list "#assistants", 1
    I create lesson
    [1] Error | TypeError: Cannot read property 'helpers' of undefined
    [1] Error | TypeError: Cannot read property 'helpers' of undefined
    [1] Starting <teardown> session
    [1] <teardown> Stopping recording promises
 » <screenshotOnFail> Test failed, try to save a screenshot
 » Screenshot is saving to C:\Work\london-smp-tests\output\Test_1.failed.png
  × FAILED in 507ms

    [2]  Starting recording promises

-- FAILURES:

  1) Feature 1
       Test 1:
     Cannot read property 'helpers' of undefined
      at selectFromList (selectFromList_helper.js:5:23)
      at CreateLessonHelper.createLesson (createLesson_helper.js:9:11)
      at Step.run (node_modules\codeceptjs\lib\step.js:66:47)
      at C:\Work\london-smp-tests\node_modules\codeceptjs\lib\actor.js:117:23

  Scenario Steps:
  - I.createLesson() at Test.<anonymous> (.\T1_test.js:5:13)
  - I.selectFromList("#assistants", 1) at Test.<anonymous> (.\T1_test.js:4:13)

  Artifacts:
  - screenshot: C:\Work\london-smp-tests\output\Test_1.failed.png


  FAIL  | 0 passed, 1 failed   // 1s

我在做什么/理解错了?

0 个答案:

没有答案