1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
describe FactoryBot::Attribute::Dynamic do
let(:name) { :first_name }
let(:block) { -> {} }
subject { FactoryBot::Attribute::Dynamic.new(name, false, block) }
its(:name) { should eq name }
context "with a block returning a static value" do
let(:block) { -> { "value" } }
it "returns the value when executing the proc" do
expect(subject.to_proc.call).to eq "value"
end
end
context "with a block returning its block-level variable" do
let(:block) { ->(thing) { thing } }
it "returns self when executing the proc" do
expect(subject.to_proc.call).to eq subject
end
end
context "with a block referencing an attribute on the attribute" do
let(:block) { -> { attribute_defined_on_attribute } }
let(:result) { "other attribute value" }
before do
# Define an '#attribute_defined_on_attribute' instance method allowing it
# be mocked. Usually this is determined via '#method_missing'
missing_methods = Module.new {
def attribute_defined_on_attribute(*args)
end
}
subject.extend(missing_methods)
allow(subject)
.to receive(:attribute_defined_on_attribute).and_return result
end
it "evaluates the attribute from the attribute" do
expect(subject.to_proc.call).to eq result
end
end
context "with a block returning a sequence" do
let(:block) do
-> do
FactoryBot::Internal.register_sequence(
FactoryBot::Sequence.new(:email, 1) { |n| "foo#{n}" }
)
end
end
it "raises a sequence abuse error" do
expect { subject.to_proc.call }.to raise_error(FactoryBot::SequenceAbuseError)
end
end
end
describe FactoryBot::Attribute::Dynamic, "with a string name" do
subject { FactoryBot::Attribute::Dynamic.new("name", false, -> {}) }
its(:name) { should eq :name }
end
|