Hi Carl,
Some thoughts below...
On 21 Oct 2009, at 18:12, Carl Graff wrote:
Well i just started using RSpec about a week ago and mostly I was
just trying to learn how to use mocks as I could have easily just
created the real object in this case.
Anyway, I had a real object, that needed to contain a hash of a yet
to be created object, which itself contained a hash of attributes.
Here is the code that I used to get the tests to past - but it
simulated a method called "name" in the mock that returned a string
value instead of a hash of string values I desired.
##################
describe ErpItemMasterRec do
context "initializing" do
before(:each) do
@itemNo = '004-907019-004'
@plmItm = ErpItemMasterRec.new(@itemNo)
['GT','CH','NB'].each do |site|
plmSiteItem = stub('plmSiteItem', :name => "#{site}-site")
@plmItm.sites[site] = plmSiteItem
end
end
it "should create new instance when receiving a valid item number as
a string" do
@itemNo.should be_instance_of(String)
@plmItm.should be_instance_of(ErpItemMasterRec)
end
it "should store item data from each mfg site that contains the
valid item number" do
@plmItm.sites['GT'].name.should == 'GT-site'
@plmItm.sites['CH'].name.should == 'CH-site'
@plmItm.sites['NB'].name.should == 'NB-site'
end
end
##################
I wanted the last part to be more like:
it "should store item data from each mfg site that contains the
valid item number" do
@plmItm.sites['GT'].attr['NAME'].should == 'GT-site'
@plmItm.sites['CH'].attr['NAME'].should == 'CH-site'
@plmItm.sites['NB'].attr['NAME'].should == 'NB-site'
end
In truth, due to my inexperience and confusion, mocks seem to slow
my development more than just creating real objects. But since there
has been so much effort to put these into testing frameworks, I
think it must be important to try and learn when it is appropriate
to use them.
The real point of mock objects (which most people miss) is to give you
a lightweight way to sketch out the behaviour of another object that
the object you're currently building will collaborate with - without
having to commit to actually building the collaborator yet. This
allows you to play out design ideas about the relationship between the
two objects and get them right before you sit down and write the
implementation of the collaborator.
In this case, it seems you've actually got very little behaviour in
the class you're apparently testing (the ErpItemMasterRec class) -
it's pretty much just a container for this list of sites, which are
all being set up in the before block. Where will this list of sites
come from when the code runs in production? Would it make more sense
to pass that in to the ErpItemMasterRec constructor?
If you really want to get your head around this stuff, I highly
recommend
http://www.mockobjects.com/book/
(though the examples are in Java)
Thanks,
Carl
Ashley Moran wrote:
On 21 Oct 2009, at 08:41, Pat Maddox wrote:
wait why do you want to do this?? Just use a regular hash and do
state-based assertions on it. Or determine the role that this
hash-like thing is doing, and use a mock to define a proper
interface.
Ashley's solution works but I am very skeptical that the approach is
a good one. Can you post some code?
I had wondered the same thing myself... but I figured if my
suspicions were right, a fallout problem would be posted soon
enough :)
Ashley
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users
cheers,
Matt
http://mattwynne.net
+447974 430184
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users