# poll 플러그인의 specs를 실행할 때 "No setting named \_\_ exists" 오류가 발생합니다

**URL:** https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751
**Category:** Support
**Created:** [8월 8, 2021, 11:36오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751 "2021-08-08T23:36:39Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![frank.manuel](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/frank.manuel/32/203348_2.png) [@frank.manuel](https://meta.discourse.org/u/frank.manuel)
#### Post date: [8월 8, 2021, 11:36오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/1 "2021-08-08T23:36:39Z")

</div>

안녕하세요,

플러그인을 만들고 있으며 테스트를 작성하려고 하고 있습니다. 하지만 아래처럼 poll 플러그인의 스펙을 실행하려고 하면

> bundle exec rake plugin:spec poll

[여기](https://meta.discourse.org/t/how-do-i-run-only-discourse-plugins-poll-spec/47244/8)에서 볼 수 있듯이 다음과 같은 오류가 발생합니다:

An error occurred while loading ./plugins/poll/spec/integration/poll\_endpoints\_spec.rb.  
Failure/Error: raise ArgumentError.new(“No setting named ‘#{name}’ exists”)

```plaintext
ArgumentError:
  No setting named 'discourse_narrative_bot_enabled' exists
# ./lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
# ./config/environments/test.rb:74:in `block (3 levels) in <main>'
# ./config/environments/test.rb:63:in `tap'
# ./config/environments/test.rb:63:in `block (2 levels) in <main>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:68:in `block in execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `each'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/activesupport-6.1.3.2/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application/finisher.rb:140:in `block in <module:Finisher>'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `instance_exec'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:32:in `run'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:61:in `block in run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/initializable.rb:60:in `run_initializers'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/application.rb:384:in `initialize!'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `public_send'
# /Users/myUser/.rvm/gems/ruby-2.7.0/gems/railties-6.1.3.2/lib/rails/railtie.rb:207:in `method_missing'
# ./config/environment.rb:7:in `<top (required)>'
# ./spec/rails_helper.rb:56:in `require'
# ./spec/rails_helper.rb:56:in `<top (required)>'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `require'
# ./plugins/poll/spec/integration/poll_endpoints_spec.rb:3:in `<top (required)>'

```

poll 플러그인의 테스트를 실행할 때 제가 무엇을 잘못하고 있는 건가요? 왜 이 특정 설정이 기본 로케일에 로드되지 않는 건가요?

감사합니다.

---

<div class="post-metadata">

### Author: ![cvx](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cvx/32/152146_2.png) [@cvx](https://meta.discourse.org/u/cvx)
#### Post date: [8월 9, 2021, 4:03오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/2 "2021-08-09T16:03:50Z")

</div>

> [@frank.manuel](#):
>
> bundle exec rake plugin:spec poll

poll 스펙만 실행하려면 명령어는 다음과 같습니다: `bundle exec rake "plugin:spec[poll]"` (또는 더 짧은 형태: `bin/rake "plugin:spec[poll]"`). 그렇지 않으면 모든 플러그인 스펙이 실행됩니다.

발생하고 있는 오류에 대해서는 확실하지 않습니다. 테스트 데이터베이스가 마이그레이션되었나요? (`bin/rails db:migrate RAILS_ENV=test`)

---

<div class="post-metadata">

### Author: ![frank.manuel](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/frank.manuel/32/203348_2.png) [@frank.manuel](https://meta.discourse.org/u/frank.manuel)
#### Post date: [8월 10, 2021, 10:05오전 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/3 "2021-08-10T10:05:19Z")

</div>

감사합니다. 말씀하신 대로 모든 플러그인 스펙이 실행되었는데, 다른 플러그인을 제거하는 방식으로 우회했습니다. [이 글](https://meta.discourse.org/t/how-do-i-run-only-discourse-plugins-poll-spec/47244/8)을 참고로 삼았지만, 마침 괄호 위치가 잘못되어 있었습니다.

네, 테스트 환경에서 데이터베이스 마이그레이션은 완료되어 있습니다. 이 오류는 `raise ArgumentError.new("No setting named '#{name}' exists")` 줄을 주석 처리하고 `puts`로 대체하는 방식으로 우회했는데, 이렇게 하면 `discourse_narrative_bot_enabled` 설정만 이 오류를 유발하고 다른 모든 설정은 정상적으로 작동하는 것을 확인할 수 있었습니다. 이 설정에 대해 우리가 특별히 작업한 적은 없는 것 같습니다. 어쨌든 이 오류를 무시하고 스펙이 정상적으로 실행되므로, 제 로컬 Discourse에는 이 우회 방식을 그대로 두겠습니다. 실제 원인을 파악하면 이 게시글을 업데이트하겠습니다.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [8월 22, 2022, 1:24오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/4 "2022-08-22T13:24:46Z")

</div>

CI에서 데이터베이스 마이그레이션을 실행하려고 할 때 정확히 이 오류가 발생하고 있습니다:

```plaintext
Run bin/rake db:create

```

```plaintext
rake aborted!
ArgumentError: No setting named 'discourse_narrative_bot_enabled' exists
/home/runner/work/discourse-multilingual/discourse-multilingual/lib/site_settings/defaults_provider.rb:58:in `set_regardless_of_locale'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:73:in `block (3 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `tap'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environments/test.rb:63:in `block (2 levels) in <main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:79:in `block in execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:72:in `with_execution_control'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:77:in `execute_hook'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:63:in `block in run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `each'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/lazy_load_hooks.rb:62:in `run_load_hooks'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application/finisher.rb:87:in `block in <module:Finisher>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `instance_exec'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:32:in `run'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:61:in `block in run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/initializable.rb:60:in `run_initializers'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:372:in `initialize!'
/home/runner/work/discourse-multilingual/discourse-multilingual/config/environment.rb:7:in `<main>'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.0/lib/zeitwerk/kernel.rb:35:in `require'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:348:in `require_environment!'
/home/runner/work/discourse-multilingual/discourse-multilingual/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/application.rb:511:in `block in run_tasks_blocks'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
Error: Process completed with exit code 1.

```

코어(core)의 이 라인으로 인해 발생하는 것으로 보입니다:

> <https://github.com/discourse/discourse/blob/d1fc759ac49c618c6a735d5765c208c7148a805c/config/environments/test.rb#L73>

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [9월 2, 2022, 7:26오전 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/5 "2022-09-02T07:26:43Z")

</div>

팀 여러분, 이게 정말 나를 미치게 만들고 있어요.

[CI](https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml)가 이 문제로 인해 `db:migrate`에서 깨지고 있습니다.

이것은 [discourse-chat 플러그인의 CI](https://github.com/discourse/discourse-chat/blob/main/.github/workflows/plugin-tests.yml)를 거의 그대로 복사한 것입니다. 다만 cron 스케줄이 추가되었을 뿐입니다.

CI는 PR과 커밋에서는 정상적으로 작동하지만, cron 작업에서는 항상 여기서 실패합니다.

Rails 콘솔에서 유사한 블록으로 이를 재현할 수 있습니다:

```plaintext
[19] pry(main)> SiteSetting.defaults.tap do |s|
[19] pry(main)* s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[19] pry(main)* end
ArgumentError: No setting named 'discourse_narrative_bot_enab' exists

```

다음과 같이 작성하면 작동합니다:

```plaintext
[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)* if s.has_setting? :discourse_narrative_bot_enab
[21] pry(main)* s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)* end
[21] pry(main)* end

```

그리고 확인 차, 다음과 같이 작성하면 실패합니다:

```plaintext
[21] pry(main)> SiteSetting.defaults.tap do |s|
[21] pry(main)* if s.has_setting? :discourse_narrative_bot_enabled
[21] pry(main)* s.set_regardless_of_locale(:discourse_narrative_bot_enab, false)
[21] pry(main)* end
[21] pry(main)* end

```

따라서 PR로 다음 변경 사항을 제안하며, 기꺼이 제출하겠습니다:

```plaintext
 if ENV['LOAD_PLUGINS'] == '1' && s.has_setting? :discourse_narrative_bot_enabled

```

어떤 이유에서인지 narrative bot 플러그인의 존재를 보장할 수 없는 것 같습니다?

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [9월 2, 2022, 9:56오전 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/7 "2022-09-02T09:56:44Z")

</div>

> [@merefield](#):
>
> 유사한 블록으로 rails 콘솔에서 이를 재현할 수 있습니다.

이 예제들에서 사이트 설정이 `discourse_narrative_bot_enabled`이 아니라 `discourse_narrative_bot_enab`으로 되어 있습니다. 그 부분을 수정하면 재현이 되지 않는 것 같습니다.

여기서 가장 놀라운 점은 다음과 같습니다:

> [@merefield](#):
>
> CI는 PR과 커밋에서는 정상적으로 작동하지만, 크론 작업에서는 항상 여기서 실패합니다.

이는 예약된 실행 시 런타임 환경에 차이가 있음을 시사합니다 🤔

[실패 로그 중 하나](https://github.com/paviliondev/discourse-multilingual/runs/8147266935?check_suite_focus=true)를 살펴보면, GitHub가 multilingual 플러그인을 자체 디렉터리가 아닌 `plugins` 디렉터리 바로 아래로 클론하는 것으로 보입니다. 즉, 사실상 모든 코어 플러그인을 '제거’하고(그리고 자신도 제대로 설치하지 못하는) 있는 것입니다.

 ![Screenshot 2022-09-02 at 10.34.50](https://global.discourse-cdn.com/meta/original/4X/f/5/b/f5bc49dc744072b5483cc1ada8a222d603c99874.jpeg)

크론을 작동시키기 위해서는 `github.event.repository.name`의 모든 발생 부분을 다른 것으로 대체해야 할 것 같습니다:

[https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml#L40](https://github.com/paviliondev/discourse-multilingual/blob/main/.github/workflows/plugin-tests.yml#L40)

[문서](https://docs.github.com/en/actions/learn-github-actions/contexts#github-context)를 살펴보면, 소유자 없이 저장소 이름을 일관되게 가져오는 방법이 없는 것 같으므로 몇 가지 트릭이 필요할 것입니다. 다음이 해결책이 될 것 같습니다:

> <https://github.com/paviliondev/discourse-multilingual/pull/59>
>
> https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on…-poll-plugin/199751/5

cc @cvx - 플러그인/테마 템플릿 CI에서도 이 기법을 사용하는 것이 좋을까요?

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [9월 2, 2022, 9:58오전 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/8 "2022-09-02T09:58:52Z")

</div>

> [@david](#):
>
> 이 예시들에서는 사이트 설정이 `discourse_narrative_bot_enabled`이 아니라 `discourse_narrative_bot_enab`으로 되어 있습니다. 이를 수정하면 재현되지 않는 것 같습니다.

오류를 강제로 발생시키고(그리고 처리하기 위해) 의도적으로 그렇게 한 것입니다.

> [@david](#):
>
> [실패 로그 중 하나](https://github.com/paviliondev/discourse-multilingual/runs/8147266935?check_suite_focus=true)를 살펴보니, GitHub가 multilingual 플러그인을 `plugins` 디렉토리로 직접 클론하는 것 같습니다. 자체 디렉토리로 클론하는 것이 아닙니다. 즉, 사실상 모든 코어 플러그인을 '제거’하고(자기 자신도 제대로 설치하지 못하고) 있습니다.

오, 정말 좋은 지적 감사합니다!

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [9월 2, 2022, 10:12오전 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/9 "2022-09-02T10:12:35Z")

</div>

> <https://github.com/paviliondev/discourse-multilingual/pull/59>
>
> https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on…-poll-plugin/199751/5

머지했습니다. @David, 정말 감사드립니다. 정말 감사한 마음이네요.

혹시 제 지역을 방문하신다면 꼭 🍻 제가 쏠게요! 🙂

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [9월 2, 2022, 12:12오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/10 "2022-09-02T12:12:04Z")

</div>

참고로 cron 테스트가 방금 완벽하게 실행되었습니다. 다시 한번 감사드립니다. 🎉

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [9월 27, 2022, 6:24오후 UTC](https://meta.discourse.org/t/no-setting-named-exists-when-trying-to-run-specs-on-poll-plugin/199751/11 "2022-09-27T18:24:38Z")

</div>

> [@david](#):
>
> 크론이 작동하려면 `github.event.repository.name`의 모든 출현 부분을 다른 것으로 대체해야 할 것 같습니다:

@cvx가 이 기사를 저에게 공유해 주셨어요:

> **[GitHub Actions: Additional information available in github.event payload for...](https://github.blog/changelog/2022-09-27-github-actions-additional-information-available-in-github-event-payload-for-scheduled-workflow-runs/)**
>
> Additional information has been added to the payload of github.event for scheduled runs. Before this change, github.event for scheduled runs would only include the cron schedule. This change adds information…

따라서 크론 작업에 대해 더 이상 해킹 방식의 저장소 이름 우회 조치가 필요하지 않을 것입니다 🎉 cc @merefield
