환경 변수에 의존하는 코드의 사양을 작성하는 가장 좋은 방법은 무엇입니까?
환경 변수에서 구성을 가져 오는 일부 코드를 테스트하고 있습니다 (프로덕션에서 Heroku 구성 변수로 설정, 로컬 개발을 위해 포먼을 사용함).
RSpec으로 이런 종류의 코드를 테스트하는 가장 좋은 방법은 무엇입니까?
나는 이것을 생각 해냈다.
before :each do
ENV.stub(:[]).with("AWS_ACCESS_KEY_ID").and_return("asdf")
ENV.stub(:[]).with("AWS_SECRET_ACCESS_KEY").and_return("secret")
end
환경 변수의 다른 값을 테스트 할 필요가 없다면 spec_helper
대신 설정할 수 있습니다 .
작동합니다.
또 다른 방법은 모의하기 쉬운 일종의 구성 개체와 같이 코드와 환경 변수 사이에 간접 계층을 배치하는 것입니다.
상수를 스텁 할 수도 있습니다.
stub_const('ENV', {'AWS_ACCESS_KEY_ID' => 'asdf'})
또는 나머지 ENV를 원하는 경우 :
stub_const('ENV', ENV.to_hash.merge('AWS_ACCESS_KEY_ID' => 'asdf'))
Heroku가 제안한 것처럼 Foreman의 .env
파일을 사용 하여 개발을위한 환경 변수를 저장할 수 있습니다.
그렇게하면 다음을 사용 foreman run
하여 사양을 실행할 수 있습니다.
foreman run bundle exec rspec spec
나는 ENV.stub (: [])을 피할 것입니다-pry와 같은 다른 것들이 ENV를 사용하는 경우 작동하지 않습니다 (DISABLE_PRY를 스텁해야한다는 오류가 발생합니다).
stub_const는 이미 지적한대로 잘 작동합니다.
테스트 중에 환경을 설정하기 위해 dotenv 를 사용하고 있지만 특정 테스트 를 위해 env 변수 를 수정 해야하는 경우 다음 접근 방식이 유용 할 수 있습니다.
스터 빙보다 간단한 방법 ENV
은 테스트 기간 동안 환경을 교체 한 다음 다음과 같이 나중에 복원하는 것입니다.
with_environment("FOO" => "baz") do
puts ENV.fetch("FOO")
end
다음과 같은 도우미 사용 ( Homebrew 소스 ) :
module Test
module Helper
module Env
def with_environment(partial_env)
old = ENV.to_hash
ENV.update partial_env
begin
yield
ensure
ENV.replace old
end
end
end
end
end
ensure
테스트에 실패하더라도 원래 환경 을 사용 하여 복원됩니다.
스터 빙, 테스트ENV
전후 값 교체, ClimateControl과 같은 gem을 포함하여 테스트 중에 환경 변수 를 설정 및 수정 하는 방법을 편리하게 비교할 수 있습니다.
https://github.com/littleowllabs/stub_env 를 사용 하여이를 수행 할 수 있습니다 . 솔루션이 제안한대로 모든 변수를 스텁하지 않고도 개별 환경 변수를 스텁 할 수 있습니다.
gem을 설치 한 다음 작성하십시오.
before :each do
stub_env('AWS_ACCESS_KEY_ID', 'asdf')
stub_env('AWS_SECRET_ACCESS_KEY','secret')
end
이 구문은 나를 위해 작동합니다.
module SetEnvVariable
def set_env_var(name, value)
# Old Syntax
# ENV.stub(:[])
# ENV.stub(:[]).with(name).and_return(value)
allow(ENV).to receive(:[]) # stub a default value first if message might be received with other args as well.
allow(ENV).to receive(:[]).with(name).and_return(value)
end
end
당신이 원하는 것은 dotenv gem 입니다.
@ciastek이 제안한 것처럼 포먼 아래에서 테스트를 실행하면 CLI에서 사양을 실행할 때 훌륭하게 작동합니다. 하지만 Sublime Text 2에서 Ruby Test로 사양을 실행하는 데 도움이되지는 않습니다. Dotenv는 당신이하는 일을 투명하게 수행합니다.
ReferenceURL : https://stackoverflow.com/questions/9611276/what-is-the-best-way-to-write-specs-for-code-that-depends-on-environment-variabl
'programing' 카테고리의 다른 글
POJO를 확장하여 JPA 엔티티를 구축 할 수 있습니까? (0) | 2021.01.15 |
---|---|
Vim : 병원체의 vimball 플러그인 권장 사항 (0) | 2021.01.15 |
O (n)과 O (log (n))의 차이점-어느 것이 더 낫고 정확히 O (log (n))는 무엇입니까? (0) | 2021.01.14 |
C # 스레드가 잠들지 않습니까? (0) | 2021.01.14 |
행 복사하지만 새 ID 사용 (0) | 2021.01.14 |