2017-06-16 155 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)' –