2017-06-16 105 views
-1

我正在努力想出一个模式,以满足我的测试和Travis运行我的脚本的能力。为节点/ ES6模块提出更好的模块模式

,我会说,我已经特拉维斯运行我的脚本的方式是我指定的脚本在我travis.yml通过节点通天命令运行如这样开始:

script: 
    - babel-node ./src/client/deploy/deploy-feature-branch.js 

这意味着当babel-node运行这个时,我需要一个方法来自动运行我所拥有的deploy-feature-branch.js。这是行let { failure, success, payload } = deployFeatureBranch()。那部队deployFeatureBranch()运行,因为它被设置为去结构命令。

在那里我也有一个options对象:

let options = { 
    localBuildFolder: 'build', 
    domain: 'ourdomain', 
    branch: process.env.TRAVIS_PULL_REQUEST_BRANCH 
} 

在一个PR构建,特拉维斯自动设置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即使我将其设置为'feature-100'。分支默认为process.env.TRAVIS_PULL_REQUEST_BRANCH,但我希望能够覆盖它并从测试中设置它。

部署-功能branch.js

import * as deployApi from './deployApi' 

let options = { 
    localBuildFolder: 'build', 
    domain: 'ourdomain', 
    branch: process.env.TRAVIS_PULL_REQUEST_BRANCH 
} 

const deployFeatureBranch = async (options) => { 
    console.log(green(`Deploying feature branch: ${options.branch}`)) 
    let { failure, success, payload } = await deployApi.run(options) 
    return { failure, success, payload } 
} 

let { failure, success, payload } = deployFeatureBranch(options) 

export { 
    options, 
    deployFeatureBranch 
} 

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

回答

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是当你打电话给你时,你就不会这么做了。

此外,导出和更改对象,虽然它可能工作,但也很奇怪,应该避免。创建一个新对象(或克隆导出的对象)绝对是一种可行的方式。

+0

我知道但我想强制执行合同。我只想要某些字段被允许 –

+0

我想我应该只使用流量类型(我不喜欢打字稿)... –

+0

我以为我传递选项:'const deployFeatureBranch = async(options)' –