diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md index 4cc3812b0f04ac2f150cf955b09a11219d67f745..2c8d488877b72a7b2420db8d2f23bce323b474b8 100644 --- a/doc/development/testing_guide/best_practices.md +++ b/doc/development/testing_guide/best_practices.md @@ -358,16 +358,11 @@ range of inputs, might look like this: describe "#==" do using RSpec::Parameterized::TableSyntax - let(:project1) { create(:project) } - let(:project2) { create(:project) } where(:a, :b, :result) do 1 | 1 | true 1 | 2 | false true | true | true true | false | false - project1 | project1 | true - project2 | project2 | true - project 1 | project2 | false end with_them do @@ -380,6 +375,11 @@ describe "#==" do end ``` +CAUTION: **Caution:** +Only use simple values as input in the `where` block. Using procs, stateful +objects, FactoryBot-created objects etc. can lead to +[unexpected results](https://github.com/tomykaira/rspec-parameterized/issues/8). + ### Prometheus tests Prometheus metrics may be preserved from one test run to another. To ensure that metrics are diff --git a/spec/models/prometheus_metric_spec.rb b/spec/models/prometheus_metric_spec.rb index 2b978c1c8ff93c52f26f98d9fb678a54a31b409e..3610408c138a9a8119064fca3d0cff3f779d600f 100644 --- a/spec/models/prometheus_metric_spec.rb +++ b/spec/models/prometheus_metric_spec.rb @@ -4,7 +4,6 @@ require 'spec_helper' describe PrometheusMetric do subject { build(:prometheus_metric) } - let(:other_project) { build(:project) } it_behaves_like 'having unique enum values' @@ -16,17 +15,17 @@ describe PrometheusMetric do describe 'common metrics' do using RSpec::Parameterized::TableSyntax - where(:common, :project, :result) do - false | other_project | true - false | nil | false - true | other_project | false - true | nil | true + where(:common, :with_project, :result) do + false | true | true + false | false | false + true | true | false + true | false | true end with_them do before do subject.common = common - subject.project = project + subject.project = with_project ? build(:project) : nil end it { expect(subject.valid?).to eq(result) }