为Node / ES6模块提供更好的模块模式

时间:2017-06-16 19:41:19

标签: javascript node.js ecmascript-6

我正在努力想出一个能够满足我的测试和Travis运行我的脚本的能力的模式。

我首先要说的是我让Travis运行我的脚本的方式是我在 travis.yml 中指定要通过node-babel命令运行的脚本,如下所示:

/pdfs/bulls/january/house/

这意味着当babel-node运行时,我需要一种方法来自动运行script: - babel-node ./src/client/deploy/deploy-feature-branch.js 。这就是deploy-feature-branch.js行。 强制 let { failure, success, payload } = deployFeatureBranch() 运行,因为它已设置为destructure命令。

在那里我还有一个deployFeatureBranch()对象:

options

在PR构建期间,travis会自动设置let options = { localBuildFolder: 'build', domain: 'ourdomain', branch: process.env.TRAVIS_PULL_REQUEST_BRANCH } 的值。那很棒!但是,我设置此模块的方式对于测试来说效果不佳。我遇到的问题是如果我尝试从我的测试中设置选项,由于某种原因选项对象没有设置

我想我要解决的问题首先是,当我尝试从我的测试中设置选项时,为什么没有设置选项。然后有更好的方法来整体设计这个模块。

测试

process.env.TRAVIS_PULL_REQUEST_BRANCH

import {options, deployFeatureBranch } from '../../../client/deploy/deploy-feature-branch' it.only('creates a S3 test environment for a pull request', async () => { options.branch = 'feature-100' options.domain = 'ourdomain' options.localDeployFolder = 'build' const result = await deployFeatureBranch() expect(result.success).to.be.true }) }) 在我的测试中运行时,执行  尝试引用deployFeatureBranch(),但即使我将其设置为options.branch,它最终仍为undefined。 branch默认为process.env.TRAVIS_PULL_REQUEST_BRANCH但我希望能够覆盖它并从测试中设置它。

部署特征-branch.js

'feature-100'

我真的无法想出一种更好的方法来解决这个问题并解决设置选项问题。我也不仅限于使用节点模块,我也可以使用ES6导出。

1 个答案:

答案 0 :(得分:0)

而不是导出options并修改它,只需在测试中调用函数时传入新的options对象:

import {deployFeatureBranch } from '../../../client/deploy/deploy-feature-branch'

    it.only('creates a S3 test environment for a pull request', async () => {
      const options = {
        branch: 'feature-100',
        domain: 'ourdomain',
        localDeployFolder: 'build'
      };

      const result = await deployFeatureBranch(options)
      expect(result.success).to.be.true
    })
});

它不起作用的原因是因为您的deployFeatureBranch()函数希望在您调用它时传递options,而您不会这样做。

此外,导出和更改对象虽然可能有效但也非常奇怪,应该避免使用。创建一个新对象(或克隆导出的对象)绝对是可行的方法。