programing

환경 변수에 의존하는 코드의 사양을 작성하는 가장 좋은 방법은 무엇입니까?

firstcheck 2021. 1. 14. 08:33
반응형

환경 변수에 의존하는 코드의 사양을 작성하는 가장 좋은 방법은 무엇입니까?


환경 변수에서 구성을 가져 오는 일부 코드를 테스트하고 있습니다 (프로덕션에서 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

반응형