Tôi muốn khai process.env.FOO
với bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Tôi bối rối. Tôi đọc tài liệu, nhưng tôi vẫn chưa hiểu. tài liệu sinonjs
sinonjs là một ví dụ, không phải sinonjs là được.
Tôi muốn khai process.env.FOO
với bar
.
var sinon = require('sinon');
var stub = sinon.stub(process.env, 'FOO', 'bar');
Tôi bối rối. Tôi đọc tài liệu, nhưng tôi vẫn chưa hiểu. tài liệu sinonjs
sinonjs là một ví dụ, không phải sinonjs là được.
Câu trả lời:
Theo hiểu biết của tôi process.env
, bạn có thể đơn giản coi nó như bất kỳ biến nào khác khi thiết lập các thuộc tính của nó. Tuy nhiên, hãy nhớ rằng mọi giá trị trong process.env
phải là một chuỗi. Vì vậy, nếu bạn cần một giá trị cụ thể trong thử nghiệm của mình:
it('does something interesting', () => {
process.env.NODE_ENV = 'test';
// ...
});
Để tránh rò rỉ trạng thái sang các thử nghiệm khác, hãy đảm bảo đặt lại biến về giá trị ban đầu hoặc xóa hoàn toàn:
afterEach(() => {
delete process.env.NODE_ENV;
});
jest
. Trong mã sản xuất của mình, tôi đã gán từ env thành const (ví dụ const X = process.env.X
). Hằng số được khai báo ở phạm vi mô-đun (ES), không phải phạm vi chức năng. Các bài kiểm tra của tôi luôn vượt qua khi jest --watch
chạy thử lại, nhưng luôn thất bại trong lần chạy đầu tiên. Có một vấn đề đặt hàng mà tôi không hiểu hết ở đây. Chỉ cần đảm bảo rằng bạn luôn đọc trực tiếp từ process.env
mã sản xuất của mình (tức là trong một hàm) và không lưu vào bộ nhớ đệm ở cấp mô-đun.
const myValue = process.env.value ? process.env.value : 'default'
sẽ không hoạt động nếu bạn đặt giá trị process.env. bên trong một bài kiểm tra. Tuy nhiên, const myValue = () => (process.env.value ? process.env.value : 'default'
) hoạt động như mong đợi!
const SWITCH_ON = (process.env.SWITCH_ON.toLowerCase() === 'true');
này không hoạt động nên tôi đã thay đổi nó thành hai dòng: var switchOn = process.env.SWITCH_ON; const SWITCH_ON = (switchOn === undefined ? false : switchOn.toLowerCase() === 'true');
Dòng đầu tiên liên tục cho tôi undefined
lỗi ở nơi tôi đang làm.toLowerCase()
Tôi đã có thể được process.env
khai thác đúng cách trong các bài kiểm tra đơn vị của mình bằng cách sao chép nó và trong một phương pháp xé nhỏ khôi phục nó.
Ví dụ sử dụng Mocha
const env = Object.assign({}, process.env);
after(() => {
process.env = env;
});
...
it('my test', ()=> {
process.env.NODE_ENV = 'blah'
})
Hãy nhớ rằng điều này sẽ chỉ hoạt động nếu process.env chỉ được đọc trong chức năng bạn đang thử nghiệm. Ví dụ: nếu mã mà bạn đang kiểm tra đọc biến và sử dụng nó trong một lần đóng, nó sẽ không hoạt động. Bạn có thể làm mất hiệu lực yêu cầu đã lưu trong bộ nhớ cache để kiểm tra điều đó đúng cách.
Ví dụ: phần sau sẽ không có env khai thác:
const nodeEnv = process.env.NODE_ENV;
const fnToTest = () => {
nodeEnv ...
}
after(() => { process.env = Object.assign({}, env); });
Nếu không, các bài kiểm tra sẽ thao túng bản sao được chia sẻ. Cần đặt sau mỗi lần kiểm tra một phiên bản mới.
Trong một spec-helper.coffee
hoặc một cái gì đó tương tự nơi bạn thiết lập hộp cát sinon của mình, hãy theo dõi bản gốc process.env
và khôi phục nó sau mỗi lần kiểm tra, để bạn không bị rò rỉ giữa các lần kiểm tra và không phải nhớ đặt lại mỗi lần.
_ = require 'lodash'
sinon = require 'sinon'
beforeEach ->
@originalProcessEnv = _.cloneDeep process.env
afterEach ->
process.env = _.cloneDeep @originalProcessEnv
Trong thử nghiệm của bạn, hãy sử dụng process.env
như bình thường.
it 'does something based on an env var', ->
process.env.FOO = 'bar'
underscore
's clone
chức năng làm việc ở vị trí của cloneDeep
- hữu ích nếu bạn đã sử dụng underscore
hơn lodash
.
Với sinon, bạn có thể khai thác bất kỳ biến nào như thế này.
const myObj = {
example: 'oldValue',
};
sinon.stub(myObj, 'example').value('newValue');
myObj.example; // 'newValue'
Ví dụ này là tài liệu dạng sinon. https://sinonjs.org/releases/v6.1.5/stubs/
Với kiến thức đó, bạn có thể khai thác bất kỳ biến môi trường nào. Trong trường hợp của bạn, nó sẽ như thế này:
let stub = sinon.stub(process.env, 'FOO').value('bar');
require('dotenv').config();
Tôi nhận ra rằng điều này thường được gọi khi ứng dụng của tôi chạy, nhưng nếu tôi đang chạy trực tiếp kiểm tra đơn vị của mình, điều này tuyên bố yêu cầu sẽ bị thiếu.
Cách mô phỏng nhanh process.env trong quá trình thử nghiệm đơn vị.
https://glebbahmutov.com/blog/mocking-process-env/
const sinon = require('sinon')
let sandbox = sinon.createSandbox()
beforeEach(() => {
sandbox.stub(process.env, 'USER').value('test-user')
})
it('has expected user', () => {
assert(process.env.USER === 'test-user', 'wrong user')
})
afterEach(() => {
sandbox.restore()
})
Nhưng còn các thuộc tính có thể không tồn tại trong process.env trước khi kiểm tra thì sao? Bạn có thể sử dụng gói sau và sau đó bạn sẽ có thể kiểm tra các biến env không tồn tại.
process.env.USER
chưa có giá trị.