setsumei 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +4 -0
- data/Rakefile +2 -0
- data/lib/setsumei.rb +2 -0
- data/lib/setsumei/build.rb +21 -0
- data/lib/setsumei/build/key.rb +28 -0
- data/lib/setsumei/describable.rb +80 -0
- data/lib/setsumei/describable/boolean_attribute.rb +34 -0
- data/lib/setsumei/describable/collection.rb +20 -0
- data/lib/setsumei/describable/float_attribute.rb +34 -0
- data/lib/setsumei/describable/int_attribute.rb +33 -0
- data/lib/setsumei/describable/object_attribute.rb +41 -0
- data/lib/setsumei/describable/string_attribute.rb +33 -0
- data/lib/setsumei/version.rb +3 -0
- data/setsumei.gemspec +24 -0
- data/spec/setsumei/build/key_spec.rb +88 -0
- data/spec/setsumei/build_spec.rb +44 -0
- data/spec/setsumei/describable/boolean_attribute_spec.rb +88 -0
- data/spec/setsumei/describable/collection_spec.rb +108 -0
- data/spec/setsumei/describable/float_attribute_spec.rb +86 -0
- data/spec/setsumei/describable/int_attribute_spec.rb +87 -0
- data/spec/setsumei/describable/object_attribute_spec.rb +105 -0
- data/spec/setsumei/describable/string_attribute_spec.rb +92 -0
- data/spec/setsumei/describable_spec.rb +132 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/be_an_attribute_of_type_matcher.rb +5 -0
- data/spec/support/shared_examples/attribute_type_creation.rb +13 -0
- metadata +139 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
describe Build do
|
5
|
+
describe ".a(klass,from: hash_data)" do
|
6
|
+
let(:klass) { mock "class" }
|
7
|
+
let(:hash_data) { Hash.new }
|
8
|
+
|
9
|
+
let(:defined_attributes) { { an_attribute: attribute } }
|
10
|
+
let(:attribute) { mock "attribute" }
|
11
|
+
let(:object) { mock "object" }
|
12
|
+
|
13
|
+
before do
|
14
|
+
klass.stub(:defined_attributes).and_return(defined_attributes)
|
15
|
+
klass.stub(:new).and_return(object)
|
16
|
+
attribute.stub(:set_value_on)
|
17
|
+
end
|
18
|
+
|
19
|
+
subject { Build.a klass, from: hash_data }
|
20
|
+
|
21
|
+
it "should instantiate klass" do
|
22
|
+
klass.should_receive(:new).and_return(object)
|
23
|
+
subject
|
24
|
+
end
|
25
|
+
it "should set value on object using attribute" do
|
26
|
+
attribute.should_receive(:set_value_on).with(object, from_value_in: hash_data )
|
27
|
+
subject
|
28
|
+
end
|
29
|
+
it { should == object }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".a(klass,from: hash_data) error conditions" do
|
33
|
+
context "klass doesn't have defined attributes" do
|
34
|
+
let(:klass) { mock "class" }
|
35
|
+
specify { expect { Build.a klass, from: {} }.to raise_error ArgumentError }
|
36
|
+
end
|
37
|
+
|
38
|
+
context "hash data isnt provided" do
|
39
|
+
let(:klass) { mock "class", defined_attributes: {} }
|
40
|
+
specify { expect { Build.a klass }.to raise_error ArgumentError }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
module Describable
|
5
|
+
describe BooleanAttribute do
|
6
|
+
its(:name) { should == nil }
|
7
|
+
|
8
|
+
describe ".named(name)" do
|
9
|
+
let(:name) { :my_boolean_field }
|
10
|
+
|
11
|
+
subject { BooleanAttribute.named(name) }
|
12
|
+
|
13
|
+
it { should be_a BooleanAttribute }
|
14
|
+
its(:name) { should == name }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#value_for(pre_type_cast_value)" do
|
18
|
+
let(:boolean_attribute) { BooleanAttribute.new }
|
19
|
+
|
20
|
+
context "where the value is a boolean" do
|
21
|
+
specify { boolean_attribute.value_for(true).should === true }
|
22
|
+
specify { boolean_attribute.value_for(false).should === false }
|
23
|
+
end
|
24
|
+
context "where the value isn't a boolean" do
|
25
|
+
specify { boolean_attribute.value_for("false").should === false }
|
26
|
+
specify { boolean_attribute.value_for("true").should === true }
|
27
|
+
specify { boolean_attribute.value_for("True").should === true }
|
28
|
+
specify { boolean_attribute.value_for("1").should === true }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#is_an_attribute_of_type?" do
|
33
|
+
let(:boolean_attribute) { BooleanAttribute.new }
|
34
|
+
|
35
|
+
subject { boolean_attribute.is_an_attribute_of_type? type }
|
36
|
+
|
37
|
+
context "where type is :boolean" do
|
38
|
+
let(:type) { :boolean }
|
39
|
+
it { should be_true }
|
40
|
+
end
|
41
|
+
|
42
|
+
context "where type is BooleanAttribute" do
|
43
|
+
let(:type) { BooleanAttribute }
|
44
|
+
it { should be_true }
|
45
|
+
end
|
46
|
+
|
47
|
+
context "where type is unknown" do
|
48
|
+
let(:type) { mock "an unknown type" }
|
49
|
+
it { should be_false }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "set_value_on object, from_value_in: hash" do
|
54
|
+
let(:hash) { Hash.new }
|
55
|
+
let(:key) { "key" }
|
56
|
+
let(:hash_keys) { mock "hash_keys" }
|
57
|
+
let(:value_in_hash) { mock "value_in_hash" }
|
58
|
+
|
59
|
+
let(:object) { mock "object", :my_boolean_attribute= => nil }
|
60
|
+
|
61
|
+
let(:boolean_attribute) { BooleanAttribute.named :my_boolean_attribute }
|
62
|
+
let(:converted_value) { mock "converted_value" }
|
63
|
+
|
64
|
+
before do
|
65
|
+
Build::Key.stub(:for).and_return(key)
|
66
|
+
hash[key] = value_in_hash
|
67
|
+
boolean_attribute.stub(:value_for).and_return(converted_value)
|
68
|
+
end
|
69
|
+
|
70
|
+
subject { boolean_attribute.set_value_on object, from_value_in: hash }
|
71
|
+
|
72
|
+
it "should detect the key it should use to retrieve the value from the hash" do
|
73
|
+
hash.should_receive(:keys).and_return(hash_keys)
|
74
|
+
Build::Key.should_receive(:for).with(:my_boolean_attribute, given: hash_keys ).and_return(key)
|
75
|
+
subject
|
76
|
+
end
|
77
|
+
it "should convert the value" do
|
78
|
+
boolean_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
79
|
+
subject
|
80
|
+
end
|
81
|
+
it "should pass object a value to the attribute described by this class" do
|
82
|
+
object.should_receive(:my_boolean_attribute=).with(converted_value)
|
83
|
+
subject
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
module Describable
|
5
|
+
describe Collection do
|
6
|
+
describe "initialization" do
|
7
|
+
its(:klass) { should be_nil }
|
8
|
+
its(:options) { should be_nil }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".of(klass,options)" do
|
12
|
+
let(:klass) { mock "klass" }
|
13
|
+
let(:options) { mock "options" }
|
14
|
+
|
15
|
+
subject { Collection.of klass, options }
|
16
|
+
|
17
|
+
it { should be_a Collection }
|
18
|
+
its(:klass) { should == klass }
|
19
|
+
its(:options) { should == options }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#set_value_on(object, from_value_in: hash)" do
|
23
|
+
let(:object) { mock "object" }
|
24
|
+
let(:hash) { Hash.new }
|
25
|
+
let(:hash_keys) { mock "hash_keys" }
|
26
|
+
let(:key) { "aHashKey" }
|
27
|
+
|
28
|
+
let(:klass) { mock "a klass" }
|
29
|
+
let(:options) { Hash.new }
|
30
|
+
let(:collection) { Collection.of klass, options }
|
31
|
+
|
32
|
+
before do
|
33
|
+
hash.stub(:keys).and_return(hash_keys)
|
34
|
+
Build::Key.stub(:for).and_return(key)
|
35
|
+
hash[key] = []
|
36
|
+
Build.stub(:a)
|
37
|
+
end
|
38
|
+
|
39
|
+
subject { collection.set_value_on object, from_value_in: hash }
|
40
|
+
|
41
|
+
it "should detect they key it should use to retreive the values from the hash" do
|
42
|
+
hash.should_receive(:keys).and_return(hash_keys)
|
43
|
+
Build::Key.should_receive(:for).with( klass, given: hash_keys).and_return(key)
|
44
|
+
subject
|
45
|
+
end
|
46
|
+
|
47
|
+
context "single value" do
|
48
|
+
let(:single_value) { mock "single_value" }
|
49
|
+
let(:single_instance) { mock "single_instance" }
|
50
|
+
|
51
|
+
before do
|
52
|
+
hash[key] = single_value
|
53
|
+
Build.stub(:a).and_return single_instance
|
54
|
+
object.stub(:<<)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should build a single instance of klass" do
|
58
|
+
Build.should_receive(:a).with(klass, from: single_value).and_return(single_instance)
|
59
|
+
subject
|
60
|
+
end
|
61
|
+
it "should append this to the object" do
|
62
|
+
object.should_receive(:<<).with(single_instance)
|
63
|
+
subject
|
64
|
+
end
|
65
|
+
end
|
66
|
+
context "multiple values" do
|
67
|
+
let(:a_value) { mock "a_value" }
|
68
|
+
let(:another_value) { mock "another_value" }
|
69
|
+
let(:more_values) { mock "more_values" }
|
70
|
+
|
71
|
+
let(:first_instance) { mock "first_instance" }
|
72
|
+
let(:second_instance) { mock "second_instance" }
|
73
|
+
let(:final_instance) { mock "final_instance" }
|
74
|
+
|
75
|
+
before do
|
76
|
+
hash[key] = [a_value,another_value,more_values]
|
77
|
+
Build.stub(:a).and_return( first_instance, second_instance, final_instance )
|
78
|
+
object.stub(:<<)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should build multiple instances of klass" do
|
82
|
+
Build.should_receive(:a).with(klass, from: a_value)#and_return(first_instance)
|
83
|
+
Build.should_receive(:a).with(klass, from: another_value)#and_return(second_instance)
|
84
|
+
Build.should_receive(:a).with(klass, from: more_values)#and_return(final_instance)
|
85
|
+
subject
|
86
|
+
end
|
87
|
+
it "should append all of these to the object" do
|
88
|
+
object.should_receive(:<<).with(first_instance)
|
89
|
+
object.should_receive(:<<).with(second_instance)
|
90
|
+
object.should_receive(:<<).with(final_instance)
|
91
|
+
subject
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "options for collection specifiy within" do
|
96
|
+
before do
|
97
|
+
options[:within] = "SpecialKeyLocation"
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should detect they key it should use to retreive the values from the hash" do
|
101
|
+
Build::Key.should_receive(:for).with( "SpecialKeyLocation", given: hash_keys).and_return(key)
|
102
|
+
subject
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
module Describable
|
5
|
+
describe FloatAttribute do
|
6
|
+
its(:name) { should == nil }
|
7
|
+
|
8
|
+
describe ".named(name)" do
|
9
|
+
let(:name) { :my_float_field }
|
10
|
+
|
11
|
+
subject { FloatAttribute.named(name) }
|
12
|
+
|
13
|
+
it { should be_a FloatAttribute }
|
14
|
+
its(:name) { should == name }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#value_for(pre_type_cast_value)" do
|
18
|
+
let(:float_attribute) { FloatAttribute.new }
|
19
|
+
|
20
|
+
subject { float_attribute.value_for pre_type_cast_value }
|
21
|
+
|
22
|
+
context "where the value is a float" do
|
23
|
+
specify { float_attribute.value_for(10.2).should == 10.2 }
|
24
|
+
end
|
25
|
+
context "where the value isn't a float" do
|
26
|
+
specify { float_attribute.value_for("10.2").should == 10.2 }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#is_an_attribute_of_type?" do
|
31
|
+
let(:float_attribute) { FloatAttribute.new }
|
32
|
+
|
33
|
+
subject { float_attribute.is_an_attribute_of_type? type }
|
34
|
+
|
35
|
+
context "where type is :float" do
|
36
|
+
let(:type) { :float }
|
37
|
+
it { should be_true }
|
38
|
+
end
|
39
|
+
|
40
|
+
context "where type is FloatAttribute" do
|
41
|
+
let(:type) { FloatAttribute }
|
42
|
+
it { should be_true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "where type is unknown" do
|
46
|
+
let(:type) { mock "an unknown type" }
|
47
|
+
it { should be_false }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "set_value_on object, from_value_in: hash" do
|
52
|
+
let(:hash) { Hash.new }
|
53
|
+
let(:key) { "key" }
|
54
|
+
let(:hash_keys) { mock "hash_keys" }
|
55
|
+
let(:value_in_hash) { mock "value_in_hash" }
|
56
|
+
|
57
|
+
let(:object) { mock "object", :my_float_attribute= => nil }
|
58
|
+
|
59
|
+
let(:float_attribute) { FloatAttribute.named :my_float_attribute }
|
60
|
+
let(:converted_value) { mock "converted_value" }
|
61
|
+
|
62
|
+
before do
|
63
|
+
Build::Key.stub(:for).and_return(key)
|
64
|
+
hash[key] = value_in_hash
|
65
|
+
float_attribute.stub(:value_for).and_return(converted_value)
|
66
|
+
end
|
67
|
+
|
68
|
+
subject { float_attribute.set_value_on object, from_value_in: hash }
|
69
|
+
|
70
|
+
it "should detect the key it should use to retrieve the value from the hash" do
|
71
|
+
hash.should_receive(:keys).and_return(hash_keys)
|
72
|
+
Build::Key.should_receive(:for).with(:my_float_attribute, given: hash_keys ).and_return(key)
|
73
|
+
subject
|
74
|
+
end
|
75
|
+
it "should convert the value" do
|
76
|
+
float_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
77
|
+
subject
|
78
|
+
end
|
79
|
+
it "should pass object a value to the attribute described by this class" do
|
80
|
+
object.should_receive(:my_float_attribute=).with(converted_value)
|
81
|
+
subject
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
module Describable
|
5
|
+
describe IntAttribute do
|
6
|
+
its(:name) { should == nil }
|
7
|
+
|
8
|
+
describe ".named(name)" do
|
9
|
+
let(:name) { :my_int_field }
|
10
|
+
|
11
|
+
subject { IntAttribute.named(name) }
|
12
|
+
|
13
|
+
it { should be_a IntAttribute }
|
14
|
+
its(:name) { should == name }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#value_for(pre_type_cast_value)" do
|
18
|
+
let(:int_attribute) { IntAttribute.new }
|
19
|
+
|
20
|
+
subject { int_attribute.value_for pre_type_cast_value }
|
21
|
+
|
22
|
+
context "where the value is a int" do
|
23
|
+
specify { int_attribute.value_for(42).should == 42 }
|
24
|
+
end
|
25
|
+
context "where the value isn't a int" do
|
26
|
+
specify { int_attribute.value_for("10.6").should == 11 }
|
27
|
+
specify { int_attribute.value_for("10.4").should == 10 }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#is_an_attribute_of_type?" do
|
32
|
+
let(:int_attribute) { IntAttribute.new }
|
33
|
+
|
34
|
+
subject { int_attribute.is_an_attribute_of_type? type }
|
35
|
+
|
36
|
+
context "where type is :int" do
|
37
|
+
let(:type) { :int }
|
38
|
+
it { should be_true }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "where type is IntAttribute" do
|
42
|
+
let(:type) { IntAttribute }
|
43
|
+
it { should be_true }
|
44
|
+
end
|
45
|
+
|
46
|
+
context "where type is unknown" do
|
47
|
+
let(:type) { mock "an unknown type" }
|
48
|
+
it { should be_false }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "set_value_on object, from_value_in: hash" do
|
53
|
+
let(:hash) { Hash.new }
|
54
|
+
let(:key) { "key" }
|
55
|
+
let(:hash_keys) { mock "hash_keys" }
|
56
|
+
let(:value_in_hash) { mock "value_in_hash" }
|
57
|
+
|
58
|
+
let(:object) { mock "object", :my_int_attribute= => nil }
|
59
|
+
|
60
|
+
let(:int_attribute) { IntAttribute.named :my_int_attribute }
|
61
|
+
let(:converted_value) { mock "converted_value" }
|
62
|
+
|
63
|
+
before do
|
64
|
+
Build::Key.stub(:for).and_return(key)
|
65
|
+
hash[key] = value_in_hash
|
66
|
+
int_attribute.stub(:value_for).and_return(converted_value)
|
67
|
+
end
|
68
|
+
|
69
|
+
subject { int_attribute.set_value_on object, from_value_in: hash }
|
70
|
+
|
71
|
+
it "should detect the key it should use to retrieve the value from the hash" do
|
72
|
+
hash.should_receive(:keys).and_return(hash_keys)
|
73
|
+
Build::Key.should_receive(:for).with(:my_int_attribute, given: hash_keys ).and_return(key)
|
74
|
+
subject
|
75
|
+
end
|
76
|
+
it "should convert the value" do
|
77
|
+
int_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
78
|
+
subject
|
79
|
+
end
|
80
|
+
it "should pass object a value to the attribute described by this class" do
|
81
|
+
object.should_receive(:my_int_attribute=).with(converted_value)
|
82
|
+
subject
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Setsumei
|
4
|
+
module Describable
|
5
|
+
describe ObjectAttribute do
|
6
|
+
its(:name) { should == nil }
|
7
|
+
its(:klass) { should == Object }
|
8
|
+
|
9
|
+
describe ".named(name)" do
|
10
|
+
let(:name) { :my_object_field }
|
11
|
+
let(:my_klass) { Class.new }
|
12
|
+
|
13
|
+
subject { ObjectAttribute.named name, as_a: my_klass }
|
14
|
+
|
15
|
+
it { should be_a ObjectAttribute }
|
16
|
+
its(:name) { should == name }
|
17
|
+
its(:klass) { should == my_klass }
|
18
|
+
|
19
|
+
context "klass is left off" do
|
20
|
+
subject { ObjectAttribute.named name }
|
21
|
+
specify { expect { subject }.to raise_error ArgumentError }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#value_for(pre_type_cast_value)" do
|
26
|
+
let(:klass) { mock "klass" }
|
27
|
+
let(:pre_type_cast_value) { { hash: "with_values" } }
|
28
|
+
let(:object_attribute) { ObjectAttribute.named :name, as_a: klass }
|
29
|
+
|
30
|
+
subject { object_attribute.value_for pre_type_cast_value }
|
31
|
+
|
32
|
+
it "should use the Builder to produce a object with klass" do
|
33
|
+
Build.should_receive(:a).with(klass, from: pre_type_cast_value)
|
34
|
+
subject
|
35
|
+
end
|
36
|
+
|
37
|
+
context "there is no data for this object" do
|
38
|
+
context "empty hash" do
|
39
|
+
let(:pre_type_cast_value) { {} }
|
40
|
+
it { should be_nil }
|
41
|
+
end
|
42
|
+
context "nil" do
|
43
|
+
let(:pre_type_cast_value) { nil }
|
44
|
+
it { should be_nil }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#is_an_attribute_of_type?" do
|
50
|
+
let(:object_attribute) { ObjectAttribute.new }
|
51
|
+
|
52
|
+
subject { object_attribute.is_an_attribute_of_type? type }
|
53
|
+
|
54
|
+
context "where type is :object" do
|
55
|
+
let(:type) { :object }
|
56
|
+
it { should be_true }
|
57
|
+
end
|
58
|
+
|
59
|
+
context "where type is ObjectAttribute" do
|
60
|
+
let(:type) { ObjectAttribute }
|
61
|
+
it { should be_true }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "where type is unknown" do
|
65
|
+
let(:type) { mock "an unknown type" }
|
66
|
+
it { should be_false }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "set_value_on object, from_value_in: hash" do
|
71
|
+
let(:hash) { Hash.new }
|
72
|
+
let(:key) { "key" }
|
73
|
+
let(:hash_keys) { mock "hash_keys" }
|
74
|
+
let(:value_in_hash) { mock "value_in_hash" }
|
75
|
+
|
76
|
+
let(:object) { mock "object", :my_object_attribute= => nil }
|
77
|
+
|
78
|
+
let(:object_attribute) { ObjectAttribute.named :my_object_attribute, as_a: mock("object_klass") }
|
79
|
+
let(:converted_value) { mock "converted_value" }
|
80
|
+
|
81
|
+
before do
|
82
|
+
Build::Key.stub(:for).and_return(key)
|
83
|
+
hash[key] = value_in_hash
|
84
|
+
object_attribute.stub(:value_for).and_return(converted_value)
|
85
|
+
end
|
86
|
+
|
87
|
+
subject { object_attribute.set_value_on object, from_value_in: hash }
|
88
|
+
|
89
|
+
it "should detect the key it should use to retrieve the value from the hash" do
|
90
|
+
hash.should_receive(:keys).and_return(hash_keys)
|
91
|
+
Build::Key.should_receive(:for).with(:my_object_attribute, given: hash_keys ).and_return(key)
|
92
|
+
subject
|
93
|
+
end
|
94
|
+
it "should convert the value" do
|
95
|
+
object_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
96
|
+
subject
|
97
|
+
end
|
98
|
+
it "should pass object a value to the attribute described by this class" do
|
99
|
+
object.should_receive(:my_object_attribute=).with(converted_value)
|
100
|
+
subject
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|