Consider the following model:
class Model < ActiveRecord::Base
scope :a, -> () { where(a: 1) }
scope :b, -> () { where(b: 1) }
scope :a_or_b, -> () { a.or(b) }
end
now to properly test each scope, I would at least provide an exaple that matches and one that doesn''t for each possible variable. Something like this:
RSpec.describe Model do
describe "scopes" do
describe ".a" do
subject { Model.a }
let!(:with_a_0) { create(:model, a: 0) }
let!(:with_a_1) { create(:model, a: 1) }
it { should_not include(with_a_0) }
it { should include(with_a_1) }
end
describe ".b" do
subject { Model.b }
let!(:with_b_0) { create(:model, b: 0) }
let!(:with_b_1) { create(:model, b: 1) }
it { should_not include(with_b_0) }
it { should include(with_b_1) }
end
describe ".a_or_b" do
subject { Model.a_or_b }
let!(:with_a_0_and_b_0) { create(:model, a: 0, b: 0) }
let!(:with_a_0_and_b_1) { create(:model, a: 0, b: 1) }
let!(:with_a_1_and_b_0) { create(:model, a: 1, b: 0) }
let!(:with_a_1_and_b_1) { create(:model, a: 1, b: 1) }
it { should_not include(with_a_0_and_b_0) }
it { should include(with_a_0_and_b_1) }
it { should include(with_a_1_and_b_0) }
it { should include(with_a_1_and_b_1) }
end
end
end
But then it feels like I'm retesting .a
and .b
on the .a_or_b
test, and if I compose it again, with yet another scope, it'll get bigger and bigger.
What is the sane way of dealing with this?
Also: is this a unit or integration test?
Aucun commentaire:
Enregistrer un commentaire