NodeJS 在npm脚本中设置baseUrl不会更改它(Cypress)

7tofc5zh  于 2022-11-29  发布在  Node.js
关注(0)|答案(3)|浏览(141)

我希望能够通过修改baseUrl的值在任何URL上运行我的Cypress脚本,但命令并没有改变它。

"cypress open --env version=development --config baseUrl=https://google.com"

我也尝试过env变量,但也不起作用:

"cypress:open:dev": "cypress open --env version=development,baseUrl=https://google.com"

设定档:

export default defineConfig({
  e2e: {
    async setupNodeEvents(on, config) {
      const version = config.env.version || 'development'
      const configFile = await import(path.join(
        config.projectRoot,
        'cypress/config',
        `${version}.json`
      ));
      const credentialsFile = await import(path.join(
        config.projectRoot,
        'cypress/config',
        'credentials.json'
      ));
      config = {
        ...config,                    // take config defined in this file
        ...configFile                 // merge/override from the external file
      }
      config.env = {
        ...config.env,                // 2nd level merge
        ...credentialsFile[version]   // from git-ignored file 
      }
      config.baseUrl = configFile.baseUrl
      return config
    },
    reporter: 'mochawesome'
  },
});

development.json:

{
    "env": {
        "baseUrl": "https://test.com",
    }
}
mwngjboj

mwngjboj1#

配置从多个源合并。看起来setupNodeEvents()中的代码是最终设置,即它在应用命令行覆盖后运行。
因此,config.baseUrl = configFile.baseUrl导致了该问题。
我会把它改成

config.baseUrl = config.baseUrl || configFile.baseUrl

由于没有通过config中的硬编码属性设置baseUrl,
例如,

export default defineConfig({
  e2e: {
    baseUrl: "some-hard-coded-url",

当没有命令行覆盖时,它将是undefined,但是如果有命令行覆盖,则它具有值。
因此,使用上面的OR运算符,它只会在configFile.baseUrl还没有值的情况下才赋值。

从命令行保存.env

由于您使用--env传递覆盖,因此合并configconfigFile的这一节完全替换了config.env节,假设您的development.json具有问题中给出的结构。

config = {
  ...config,      // env from command-line overrides are on .env property 
  ...configFile   // env from external file replaces that property entirely
}

因此后面的任何操作都无效。
相反,保存初始的config.env,并在以后合并credentialsFile时使用它。
现在OR条件(||)按预期工作,

const env = {...config.env}
config = {...config,...configFile}
config.env = {...env,...credentialsFile[version]}

config.baseUrl = config.env.baseUrl || configFile.env.baseUrl

我的结果

当我运行它的时候,我得到baseUrl: 'https://google.com'

"cypress:open:dev": "cypress open --env version=development,baseUrl=https://google.com"

运行时得到baseUrl: 'https://test.com'

"cypress:open": "cypress open"

configFile的路径中包含env

请注意,您的development.jsonbaseUrl之前的路径中有env,因此请将configFile.baseUrl变更为configFile.env.baseUrl

but5z9lq

but5z9lq2#

您正在覆盖config.env设置,必须将它们合并回配置中。

export default defineConfig({
  e2e: {
    async setupNodeEvents(on, config) {
      ...
      config = {
        ...config,                    // take config defined in this file
        ...configFile,                // merge/override from the external file
        env: {...config.env}          // don't merge env
      }
      ...
      return config
    },
    reporter: 'mochawesome',
    // baseUrl: 'http://example.com',     // cannot use this with above merge!!
  },
})

但是,如果您这样做,则不能直接设置baseUrl,因为它将优先于development.json
问题是,为什么env.baseUrldevelopment.json中?为什么不遵循标准惯例并使用

开发人员.json:

{
  "baseUrl": "https://test.com",
}
1cklez4t

1cklez4t3#

您可以使用此命令来设置baseUrl:

"cypress:open:dev": "CYPRESS_BASE_URL=https://google.com cypress open --env version=development"

相关问题