Spec Your Views
82 comments Latest by Bin Wed, 01 Sep 2010 04:37:38 GMT
I meant to work on this post… oh about 7 months ago.
Way back in January (7 months ago), Jamis Buck posted an article titled, Testing your views, which gave a few tips on using Test::Unit to, as the title suggests, test your views.
While, I’m not going to rewrite everything that Jamis wrote, I’d like to show you how to test these views with RSpec. (you might take a moment to quickly read his post…)
In this example, I’m going to show you how we’re able to write specs for the following RHTML, which you’ll notice matches the code that he wrote tests for.
<% if @user.administrator? %>
Hi <%= @user.name %>! You appear to be an administrator.
<%= link_to "Click here", admin_url, :id => "admin_link" %>
to see the admin stuff!
<% end %>
Jamis writes, “The only really significant thing you ought to be testing here is that the admin link only shows up for administrators. “
So, let’s do just that, but with RSpec.
I’m not sure how Jamis is handling his view tests, but we’re going to approach our view specs, much like we approach our controller specs, with the use of mocks and stubs, because we really don’t need to spec any of our models at this level in the application.
Tip: Write specifications for your models… in your model specs not in your controller or view specs.
The first thing that we’re going to do is setup a custom spec helper, because for something like an mocked user, will probably get reused in other areas of the user interface. Spec helpers are essentially modules that you can include in your RSpec descriptions (the block that starts with describe) and reuse.
In this spec helper, I’m going to include two methods, to mock the User model and stub out any of the methods that are necessary for spec’n this view.
module MockUserHelper
def mock_normal_user
user = mock(User)
user.stub!(:administrator?).and_return(false) # <--- NOT an admin
user.stub!(:name).and_return('David Chelimsky')
return user
end
def mock_admin_user
user = mock(User)
user.stub!(:administrator?).and_return(true) # <--- IS an admin
user.stub!(:name).and_return('Aslak Hellesoy')
return user
end
end
In the mock_normal_user method, we’re constructing a mock object and stubbing out the methods that we see are being called in the RHTML code. In mock_admin_user, we’re basically doing the same thing, but just stubbing the administrator? method to return true for this mock user.
By stubbing these methods, we’ll be able to send a non-ActiveRecord object to the view and have it render without knowing the difference. For example, the if @user.administrator? condition will return true or false, depending on how we stubbed it.
For more information on mocks and stubs, read here.
Now that we have our spec helper, let’s go ahead and dive into a few specifications for the view.
describe "index page" do
include MockUserHelper
it "should render an admin link for an admin user" do
assigns[:user] = mock_admin_user
render 'index'
response.should have_tag('a#admin_link')
end
it "should not render an admin link for a normal, non-admin user" do
assigns[:user] = mock_normal_user
render 'index'
response.should_not have_tag('a#admin_link')
end
end
Please note: This code example is only longer than the one shown by Jamis because he didn’t include how he setup all his user sessions/objects. ;-)
When these specs are run, we can see the following results.

Pretty output courtesy of RSpec + TextMate bundle
Great, we’ve been able to write specifications for our Rails views without a lot of pain. Stay tuned for more posts on this topic as I continue writing about how Designers and Developers can work together, in harmony. (see my last post on this topic)
For more information on adopting RSpec, please visit the RSpec project homepage.
Enjoying the content? Be sure to subscribe to my RSS feed.






Good article, I seriously think that view testing is REALLY important and too often overlooked. And if you do true TDD, the view tests should come before your code!
Regarding your great example, I believe we could even check on the link itself by doing something like that:
Nice article.
Havent really done much with regards to view specs, but would love to start a project by writing them first.
ZenTest’s view tests let you do cool stuff like:
assert_links_to admin_url
wish they’d add that to the rspec view tests.
You may also use
user = mock_model(User, :administrator? => true, :name => ‘Aslak Hellesøy’)
Joe, using RSpec custom matchers, it would be quite possible to write something like:
Custom matchers are very easy to write. See the RSpec rdoc for more information.
Nice, clear article. Thanks Robby.
And thanks for spelling my name right. Although I do question the wisdom of making Alsak an admin instead of me.
The only thing I’d add is that BDD is a design process, and “behaviour-driven” means write the examples of behaviour before the code that implements it.
I think this is much easier to grok when dealing with models than it is with views, in large part because we don’t want to specify every character we stick in a view – just the stuff w/ business value – in order to avoid binding the examples too closely to the code.
But difficult to grok or not, an important benefit of BDD gets lost when you’re spec’ing existing code rather than implementing bits of code against bits of specs in a red-green-refactor cycle.
Thanks for the feedback people. Some good ideas on how to extend and improve the examples.
Matt,
Indeed. This is a very important thing to point out. While this is the ideal, it isn’t always what happens. For example, we’ve been contracted on several occasions to integrate testing into existing Rails applications quite often. So, we’ve had to work on a process for diving into an existing application and begin working on specs.
David C,
You’re welcome and I made this decision with extreme caution, but don’t worry… I have big plans for you in future code samples. ;-)
Sorry for being a bit OT, but this quote reminds me of a pet peeve of mine with Rspec and Rcov.
When you run a controller spec with rcov, it’ll show code coverage for any files that were executed, including any models that it uses (assuming I don’t mock them all, which I usually do). If I’m spec’ing my controller, I want to restrict coverage reporting to that controller file only. I don’t care if any libs, helpers or models were used, I want their coverage to be 0% until I spec them explicitly.
I think if there was a way to tell rcov inside a spec which files are to include in the coverage report, and the true coverage was reported, alot of projects would see their coverage drop significantly. Even though it would result in a bit of a drop this would give people a better indication of how well they really are covering their code, rather than assuming because one spec ran some unrelated code that it was being fully tested.
Thanks Robby,
That was really helpful, especially since I was wondering “wtf is the point of view testing. How would I do it in rSpec?”
I’d love some more examples over time. Thanks again.
Double thanks from me.
For some reason, existing ‘blog docs’ on Rspec just are not as clear and well written as yours ;)
Keep it up, you’ve got another subscriber.
sudara
I wonder about using mocks in cases like this.
I tend to use mocks when the original asset itself is difficult to test, but if the ActiveRecord object is just as easy to test as the mock, why not get more bang for your testing buck?
That is, I don’t understand why decoupled test are a positive in and of themselves.
Let me give an example. Let us say I changed the interface on User and on the methods relating to permissions. My User unit test break, and I fix those. But now my views are actually broken, but because the decoupled view tests test against the mock, they still pass: a false positive. And I have no indication from my testing framework that my application is broken.
It almost seems as though mocks violate DRY since they force me to specify the interface to my models twice, both in the model itself and in the mocks: a maintenance burden.
I tend to use fixtures with mocked methods (admin?) for view testing, so that i do not need to mock every field and can be sure my test subjects stay valid
It’s always nice to have some real world examples for Rspec. I just started to use Rspec in a project. Do you know whether there is any book around. I found only one book, but that was never published…. Greets, Daniel
Great post, thank you for sharing
It almost seems as though mocks violate DRY since they force me to specify the interface to my models twice, both in the model itself and in the mocks: a maintenance burden.
project. Do you know whether there is any book around. I found only one book, but that was never published…. Greets, Daniel
DRY since they force me to specify the interface to my models twice, both in the model itself and in the mocks: a maintenance burden.
DRY since they force me to specify the interface to my models twice, both in the model itself and in the mocks: a maintenance burden.
the interface to my models twice, both in the model itself and in the mocks: a maintenance burden.
Have you ever tried this within a CMS – such as drupal or cascade?
If you are looking for the best brand new laptop batteries at the most preferred price, http://www.adapterlist.com/hp/pavilion-dv2000.htm HP pavilion dv2000 Battery http://www.adapterlist.com/hp/pavilion-dv6000.htm HP pavilion dv6000 Battery http://www.adapterlist.com/hp/dv2000.htm hp dv2000 battery
thank you for this outstanding article.I thought certino was the best technologh for laptop battery performance. http://www.globallaptopbattery.co.uk/sony/vgp-bps2a.htm Sony vgp-bps2a Battery http://www.globallaptopbattery.co.uk/sony/vgp-bps2b.htm Sony vgp-bps2b Battery http://www.globallaptopbattery.co.uk/sony/vgp-bps2c.htm Sony vgp-bps2c Battery
module MockUserHelper def mock_normal_user user = mock(User) user.stub!(:administrator?).and_return(false) # <- NOT an admin user.stub!(:name).and_return(‘David Chelimsky’) return user end
The first thing that we’re going to do is setup a custom spec helper, because for something like an mocked user, will probably get reused in other areas of the user interface.
And acknowledgment for spelling my name right. Although I do catechism the acumen of authoritative Alsak an admin instead of me. The alone affair I’d add is that BDD is a architecture process, and “behaviour-driven” agency address the examples of behaviour afore the cipher that accouterments it.
This is a actual important affair to point out. While this is the ideal, it isn’t consistently what happens. For example, we’ve been apprenticed on several occasions to accommodate testing into absolute Rails applications absolutely often. So, we’ve had to plan on a action for diving into an absolute appliance and activate alive on specs.
When you run a ambassador blueprint with rcov, it’ll appearance cipher advantage for any files that were executed, including any models that it uses (assuming I don’t apish them all, which I usually do). If I’m spec’ing my controller, I wish to bind advantage advertisement to that ambassador book only. I don’t affliction if any libs, cadre or models were used, I wish their advantage to be 0% until I blueprint them explicitly.
Let me accord an example. Let us say I afflicted the interface on User and on the methods apropos to permissions. My User assemblage analysis break, and I fix those. But now my angle are in fact broken, but because the decoupled appearance tests analysis adjoin the mock, they still pass: a apocryphal positive. And I accept no adumbration from my testing framework that my appliance is broken.
Many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.car dvd laptop ac adapter
Herve Leger Purple and Silver Bandage Dresses Herve Leger racer back dress Herve Leger Scoopneck Tank Blue Dress Herve Leger Scoopneck Tank Dress Lemon Herve Leger Scoopneck Tank Dress Pink Herve Leger sequin-applique bandage dress Herve Leger slash dress Herve Leger Strapless Bandage Dress Herve Leger Strapless Bandage Dress black
nike sb shoes
Hi. Thank you a lot for this information. I’ll follow you on each post you write ;) .Nice words
ert re t
Nice article!I would follow it when I want to finish my wedding.
tyu ty
tyuty
er tret
re t
coach watches http://www.discount-coach-outlet.com/coach-watches.html zkazxh@qq.com Leisure is more and more important in the life. Here I know a lot of leisure that is good at me. Adjust our life interest, bring us the enthusiasm of exercise. The post is very well. By the way I know some websites is very well such as http://www.all-carefully.net Disscount fashionable item is hotting on sale!
I think if there was a way to tell rcov inside a spec which files are to include in the coverage report, and the true coverage was reported, alot of projects would see their coverage drop significantly. Even though it would result in a bit of a drop this would give people a better indication of how well they really are covering their code, rather than assuming because one spec ran some unrelated code that it was being fully tested.
coach watches http://www.discount-coach-outlet.com/coach-watches.html zkazxh@qq.com Leisure is more and more important in the life. Here I know a lot of leisure that is good at me. Adjust our life interest, bring us the enthusiasm of exercise. The post is very well. By the way I know some websites is very well such as http://www.all-carefully.net Disscount fashionable item is hotting on sale!
Took me time to go through all of the feedback, however I actually loved the article. It proved to be very useful to me and I am certain to all the commenters right here as well! It’s all the time nice when you cannot solely be told, but additionally entertained! I am certain you had enjoyed penning this blog post.
thanks for explain this topic
your give easy explanation. great work. :)
good explain as well.
hi,The Motif of your blog is very good to me, I hope more exchanges with you this Motif.
Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming. Thanks again and good luck!
I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. In fact your creative writing ability has inspired me. Really the article is spreading its wings rapidly…
I am hoping the same best work
power strips
power socket
extension cords
screwdriver
booster cables
battery clip
tow rope
ratchet tie dowm
bathroom vanity
mosaic glass
extension cord
power strip
copper clad aluminum
recliner sofa
adhesive tape
shower enclosure
shower room
bathtub
bar stools
non-woven bag
bamboo blinds
waiting chairs
security tags
eas
cosmetic packaging
power cable
speaker cable
solar collector
solar water heater
extension cord
glue gun
power socket
drawing machine
straightening machine
power strip
recliner
leather sofa
sectional sofa
makeup brushes
hair rollers
make up brushes
drawer runner
drawer slides
solar heater
solar energy
bucket teeth
ratchet tiedown
booster cable
tow rope
glue stick
glue gun
booster cable
power cord
trouble light
glass bottle
dinning chair
optical fiber Cable
solar lighting
power strip
extension cord
trouble light
theater chair
tiered seating
booster cable
glue gun
battery clip
hot glue gun
power strips
booster cable
extension cords
screwdriver
swing chain
iron chain
knit scarf
knit hat
knitted shawl
booster cables
battery clip
tow rope
ratchet tie down
shower room
shower enclosure
computer steam shower room
bed hooks
scaffold coupler
solar water heater
solar collector
hair accessories
christmas ball
clinical thermometer
infrared forehead thermometer
rapid thermometer
basal thermometer
pacifier thermometer manufacturer
fever thermometer manufacturer
electronic thermometer manufacturer
forehead thermometer
medical thermometer
digital thermometer
flexible thermometer manufacturer
waterproof thermometer
baby thermometer manufacture
ear thermometer
infrared ear thermometer
digitalsphygmomanometermanufacturer
digital blood pressure monitor manufacturer
upper arm blood pressure monitor
automatic digital blood pressure monitor
wrist blood pressure monitor
When you run a controller spec with rcov, it’ll show code coverage for any files that were executed, including any models that it uses (assuming I don’t mock them all, which I usually do). If I’m spec’ing my controller, I want to restrict coverage reporting to that controller file only. I don’t care if any libs, helpers or models were used, I want their coverage to be 0% until I spec them explicitly.
Your articles are always and refreshing and fun to read. Thanks Robby!
Thanks a lot for enjoying this beauty article with me. I am apreciating it very much! Looking forward to another great article. Good luck to the author! all the best!
Monogram Mini Lin Louis Vuitton Speedy 30 M95319 Louis Vuitton Speedy 30 Louis Vuitton Saumur M95314 Louis Vuitton Saumur Louis Vuitton Bucket PM M95316 Louis Vuitton Bucket Louis Vuitton Boulogne M95317 Louis Vuitton Boulogne Louis Vuitton Speedy 30 M95224 Louis Vuitton Speedy 30 Louis Vuitton Saumur XL M95220 Louis Vuitton Saumur XL Louis Vuitton Diaper Bag M95221 Louis Vuitton Diaper Bag Louis Vuitton Danube M95228 Louis Vuitton Danube Louis Vuitton Bucket PM M95226 Louis Vuitton Bucket Louis Vuitton Boulogne M95225 Louis Vuitton Boulogne Louis Vuitton Manon Mini Pouch M95668 Louis Vuitton Manon Mini Pouch Louis Vuitton Manon PM M95621 Louis Vuitton Manon Louis Vuitton Manon MM M95619 Louis Vuitton Manon Louis Vuitton Saumur M95227 Louis Vuitton Saumur Louis Vuitton Manon PM Platine M95620 Louis Vuitton Manon PM Platine Louis Vuitton Angele M95622 Louis Vuitton Angele Louis Vuitton Angele M95617 Louis Vuitton Angele Louis Vuitton Manon MM M95618 Louis Vuitton Manon
This was a useful post and I think it is rather easy to see from the other comments as well that this post is well written and useful. Keep up the good work asics shoes asics running shoes Asics 77 Asics 78 Onitsuka Tiger Tokidoki Fabre asics onitsuka women’s asics gel nimbus
But now my angle are in fact broken, but because the decoupled appearance tests analysis adjoin the mock, they still pass: a apocryphal positive. And I accept no adumbration from my testing framework that my appliance is broken. jump higher earth4energy Electronic Cigarette tava tea error fix
well its you know its awesome
fantastic blog . please keep us updated. hot news | android phone | protect kids | investigation | food | worker | watch expendables online | music magazine
fantastic blog . please keep us updated.
I so enjoy your writing, thank you for posting an interesting article and good.
That’s a cool script. I am grateful because you have shared with my article interesting.
hello,if you want to buyignition unitpower striptruck cranemobile craneroad sweepermen wholesale clothingwomen wholesale clothingWholesale Men clothingWholesale women clothinghair products,thank you.
Very nice post, thanks. But why don’t you remove the spam above my comment? :)
It’s really great post, i also searching for something like that, good information, I would like to appreciate your work, Thanks for sharing logo design & logo designs
www.airjordanshoesdiscount.com/air-jordan-1-c-2.html > retro jordan www.vibram5fs.com/vibram-five-fingers-bikila-c-44.html > vibram five fingers www.fivefingersvibramdiscount.com/vibram-five-fingers-bikila-c-8.html > vibram five fingers Bikila www.uggaustralianew.com/ugg-classic-tall-5815-boots-c-6.html > ugg australia www.airjordanshoesdiscount.com/air-jordan-1-c-3.html > air force one www.vibram5fs.com/vibram-five-fingers-classic-c-1.html > vibram five fingers sale www.fivefingersvibramdiscount.com/vibram-five-fingers-bikila-c-8.html > vibram five fingers running www.uggaustralianew.com/ugg-bailey-button-5803-boots-c-33.html > ugg uk www.airjordanshoesdiscount.com/air-jordan-1-c-4.html > air jordans www.vibram5fs.com/vibram-five-fingers-classic-c-1.html > vibram five fingers classic www.fivefingersvibramdiscount.com/vibram-five-fingers-classic-c-1.html > Vibram Five Fingers Classic www.uggaustralianew.com/ugg-classic-short-5825-boots-c-8.html > winter boots www.airjordanshoesdiscount.com/air-jordan-2-c-5.html > jordan 1 www.vibram5fs.com/vibram-five-fingers-flow-c-10.html > vibram five fingers flow www.fivefingersvibramdiscount.com/vibram-five-fingers-classic-c-2.html > vibrams five finger shoes www.uggaustralianew.com/ugg-classic-short-5825-boots-c-8.html > fur boots www.airjordanshoesdiscount.com/air-jordan-2-c-6.html > air force ones
thanks for this useful info
nice
have a good time
Now that we have our spec helper, let’s go ahead and dive into a few specifications for the view.
In the mock_normal_user method, we’re constructing a mock object and stubbing out the methods that we see are being called in the RHTML code. In mock_admin_user, we’re basically doing the same thing, but just stubbing the administrator? method to return true for this mock user.
great post…cheerful master Travel Jakarta bandung
great share mate, very appreciate it :D
Start Sharing Not Selling l Amazon Best Buy Products l Hottest Celebrity Gossip l Start Sharing Not Selling
g that Jamis wrote, I’d like to show you how to test these views with RSpec. (you might ta
flowers delivery I really liked your article. Keep up the good work. I love flowers…I am also interested to send flowers all over the world….
great tutorial! individual Health Insurance quotes health insurance insurance price quotes Auto Insurance Quotes Annuity Quotes
The only thing I’d add is that BDD is a design process, and “behaviour-driven” means write the examples of behaviour before the code that implements it. coach wallets
I Found the website recently, and I will follow up recently. I would like to thank you for the efforts you have made in writing this article.
Great Buddy how you know about this in very details, it is really very interesting and knowledgeable things.
carpet cleaning phoenix
Our main purpose is to help you find the hot toys . Our Animal Shaped Rubber Bands is selling fast. These animal rubber bands wholesale are made of silicone. wholesale Animal Shaped Rubber Bands are not just pretty,Animal Rubber Bands wholesale are also quite clever because they recover their original shape after each use, so you can use them over and over again. zhu zhu pets, Baby Carriers is our new product.It is one of our best seller. , power balance Pillow Pets Plush Pencil Case is hot selling. Silicone Watch They are rich-looking and most attractive and very popular with our other customers. We have business conections all over the world.Our hot toys includes: Taylormade golf, Callaway Golf, bakugan battle brawlers and something special golf equipment Animal Shaped Rubber Bands We show you the hottest toys that are out right now. Our lists are compiled using analgorithym based on the toys popularity, quality, value, safety, awards, and innovation. You will find your favorite toys in toptoys2trade.com. new bakugan include female bakugan, it is really amazing cute. Everyone loves her. Solar Powered Toys helps you enjoy low-carbon lifestyle, with the help of sun, build your interesting life. prada handbags ecco shoes d&g handbags guess handbags http://www.jerseys2trade.com/power-balance-c-142/ ">power balance
Such People Are really consistent to spam links on websites sucks
Good article but what exactly does RHTML stand for? Power4home
‘Gucci Charm’ Medium Tote 247237 F4CLG 9794 ‘Gucci Charm’ Medium Tote 247237 F4CLG 9794 ‘Gucci Craft’ Medium Tote 247209 F4CMG 8453 ‘Gucci Heritage’ Large Boston Bag 247572 BGL2G 2365 ‘Gucci Heritage’ Large Tote 247574 A7MAG 1060 Gucci ‘Bamboo Bar’ Large Tote 232927 A2O1N 2703 Gucci ‘Bamboo Bar’ Large Tote 232927 F4G1N 9763 Gucci ‘Bamboo Bar’ Large Tote 232946 F4G1N 9757 Gucci ‘Bamboo Bar’ Medium Tote 232959 F4G1N 9763 Gucci ‘D Gold’ Medium Tote 211982 FFPAG 9643 Gucci ‘D Gold’ Small Tote 189831 FFPAG 9643 Gucci ‘GG running’ medium tote 247183 AL70T 2814 Gucci ‘GG Twins’ Medium Boston Bag 232958 F4C7N 9761 Gucci ‘GG Twins’ Medium Boston Bag 232958 F4C7N 9761 Gucci ‘GG Twins’ Medium Tote 232957 F4C7N 8613 Gucci ‘Icon Bit’ Large Tote 232952 FWCGN 9767 Gucci ‘Icon Bit’ Medium Tote 229852 AA61R 1000 Gucci ‘Icon Bit’ Medium Tote 229852 AA61R 9022 Gucci ‘Icon Bit’ Medium Tote 229852 FWCGN 9767 Gucci ‘Interlocking’ Medium Tote 223954 FWC4T 9762 Gucci ‘Jolie’ Large Tote 211970 FTAVJ 9765 Gucci ‘Jolie’ Large Tote 211970 FTAVX 8429 Gucci ‘Jolie’ Large Tote 211970 FTAVX 9791 Gucci ‘Jolie’ Large Tote 211975 FAF4X 1000 Gucci ‘Jolie’ Large Tote 211975 FAF4X 9769 Gucci ‘Jolie’ Medium Tote 211971 FTAVX 9791 Gucci ‘Jolie’ Medium Tote 211971 FTAVX 8429 Gucci ‘Joy’ Medium Boston Bag 193603 FP1JG 8552 Gucci ‘Joy’ Medium Boston Bag 193603 AH01G 9022 Gucci ‘Joy’ Medium Boston Bag 193603 FP1JG 9761 Gucci ‘Jungle’ Large Tote 232942 BGD0N 1908 Gucci ‘Ladies Web’ Medium Tote 211936 FTATG 9791 Gucci ‘Ladies Web’ Medium Tote 211936 FTATG 9791 Gucci ‘Sukey’ Large Tote 211943 ECUDG 9560 Gucci ‘Sukey’ Large Tote 211943 FAFXG 8526 Gucci ‘Sukey’ Large Tote 211943 FAFXG 9769 Gucci ‘Sukey’ Large Tote 211943 FN92G 9752 Gucci ‘Sukey’ Large Tote 211943 FVEHG 9761 Gucci ‘Sukey’ Large Tote 211943 FVEHG 9769 Gucci ‘Sukey’ Medium Boston Bag 223974 FAFXG 8526 Gucci ‘Sukey’ Medium Boston Bag 223974 FAFXG 9643 Gucci ‘Sukey’ Medium Boston Bag 223974 FAFXG 9761 Gucci ‘Sukey’ Medium Boston Bag 223974 FAFXG 9769 Gucci ‘Sukey’ Medium Boston Bag 223974 FAGEG 9770 Gucci ‘Sukey’ Medium Tote 211944 AA61G 2535 Gucci ‘Sukey’ Medium Tote 211944 FAFXG 8526 Gucci ‘Sukey’ Medium Tote 211944 FAFXG 8613 Gucci ‘Sukey’ Medium Tote 211944 FAFXG 9761 Gucci ‘Sukey’ Medium Tote 211944 FAGEG 9770 Gucci ‘Sukey’ Medium Tote 211944 FVEHG 9761 Gucci ‘Sukey’ Medium Tote 211944 FVEHG 9769 Gucci ‘Sunset’ Medium Tote 232954 A261T 1200 Gucci ‘Sunset’ Medium Tote 232954 F4G1T 9685 Gucci ‘Sunset’ Medium Tote 232973 A7M0N 9014 Gucci ‘Techno Tag’ Medium Tote 241101 AF51N 9014 Gucci ‘Techno Tag’ Medium Tote 241101 FWCGN 8655 Gucci ‘Techno Tag’ Medium Tote 241101 FWCGN 8655 Gucci ‘Bamboo’ Medium Top Handle Bag 224964 A2O0G 1200 Gucci ‘Bamboo’ Medium Top Handle Bag 224964 A2O0G 1200 Gucci ‘Bamboo’ Medium Top Handle Bag 224964 A2O0G 1200 Gucci ‘Icon Bit’ Large Top Handle Bag 232949 FWCGN 8651 Gucci ‘Joy’ Medium Top Handle Bag 203696 FP1JG 8552 Gucci ‘New Bamboo’ Large Top Handle Bag 240241 EIM2N 1000 Gucci ‘New Bamboo’ Large Top Handle Bag 240241 FWCGN 8655 Gucci ‘Secret’ Medium Top Handle Bag 223941 FWC3T 9664 Gucci ‘Secret’ Medium Top Handle Bag 223948 FWC3T 9664 Gucci ‘Pelham’ Medium Shoulder bag 137621 FAF3G 1000 Gucci ‘D Gold’ Large Shoulder Bag 189835 AA61G 9022 Gucci ‘D Gold’ Large Shoulder Bag 189835 FFPAG 9761 Gucci ‘D Gold’ Large Shoulder Bag 189835 FFPAG 9643 Gucci ‘Icon Bit’ Medium Shoulder Bag 228584 ECU6R 1000 Gucci ‘Interlocking Icon’ Medium Shoulder Bag 223951 ECU6T 1000 Gucci ‘Interlocking Icon’ Medium Shoulder Bag 223951 FTAQT 9643 Gucci ‘Interlocking Icon’ Medium Shoulder Bag 223951 FTAQT 9761 Gucci ‘Jungle’ Large Shoulder Bag 232940 BGD0N 1000 Gucci ‘New Jackie’ Large Shoulder Bag 218491 A261G 1200 Gucci ‘New Jackie’ Large Shoulder Bag 218491 A261G 2703 Gucci ‘New Jackie’ Large Shoulder Bag 218491 EG91G 3069 Gucci ‘New Jackie’ Large Shoulder Bag 219704 BCC8G 1000 Gucci ‘New Jackie’ Large Shoulder Bag 223929 CTA0G 1000 Gucci ‘New Pelham’ Large Shoulder Bag 223955 A2O0T 2703 Gucci ‘New Pelham’ Large Shoulder Bag 223955 F4G1T 9780 Gucci ‘New Pelham’ Large Shoulder Bag 223958 A261T 2033 Gucci ‘New Pelham’ Large Shoulder Bag 223958 A2O0T 2703 Gucci ‘New Pelham’ Large Shoulder Bag 223958 F4G1T 9780 Gucci ‘Pelham’ Medium Shoulder Bag 137621 FAF3G 9761 Gucci ‘Pelham’ Small Shoulder Bag 137621 FAF3G 9643 Gucci ‘Pelham’ Small Shoulder Bag 162900 AA61G 9022 Gucci ‘Pelham’ Small Shoulder Bag 162900 FAF3G 9643 Gucci Charlotte’ Medium Shoulder Bag 203503 FFP5G 9643 Gucci Large Shoulder Flap Bag 240236 EIM2N 1000 Gucci Large Shoulder Flap Bag 240236 FWCGN 8655 Gucci Medium Shoulder Flap Bag 240266 FWCGN 8655 ‘Gucci Heritage’ Medium Hobo 247602 A7MAG 2061 ‘Gucci Heritage’ Medium Hobo 247602 AIX2G 2187 Gucci ‘Charlotte’ Medium Hobo 211810 FTAQZ 8701 Gucci ‘D Gold’ Large Hobo 189833 AA61G 2019 Gucci ‘GG Running’ Medium Hobo 247185 EJG1T 2814 Gucci ‘GG Running’ Medium Hobo 247185 F4CIT 8569 Gucci ‘GG Twins’ Large Hobo 232945 F4C7N 9643 Gucci ‘GG Twins’ Medium Hobo 232962 AA61N 9022 Gucci ‘GG Twins’ Medium Hobo 232962 F4C7N 8708 Gucci ‘GG Twins’ Medium Hobo 232962 F4C7N 9769 Gucci ‘Icon Bit’ Large Hobo 232950 EIA2N 7685 Gucci ‘Icon Bit’ Medium Hobo 232961 FWCGN 8651 Gucci ‘Icon Bit’ Medium Hobo 232961 FWCGN 9767 Gucci ‘Interlocking’ Medium Hobo 223952 FWC4T 9762 Gucci ‘Jungle’ Medium Hobo 232930 BGD0N 1908 Gucci ‘Pelham’ Medium Hobo 211986 F4G1T 9685 Gucci ‘Pelham’ Medium Hobo 211986 FAF3G 9643 Gucci ‘Secret’ Medium Hobo 223949 FWC3T 9664 Gucci ‘Sukey’ Medium Hobo 232955 AA61G 5709 Gucci ‘Sukey’ Medium Hobo 232955 FAFXG 9761 Gucci ‘Sukey’ Medium Hobo 232955 FAFXG 9769 Gucci ‘Techno Horsebit’ Large Hobo 240239 A7M0N 1000 Gucci \’D Gold\’ Large Hobo 189833 FFPAG 9761 Gucci \’Ladies Web\’ Medium Hobo 211934 BEG1G 9022 Gucci ‘Croisette’ Evening Bag 235320 BGD0N 1000 Gucci ‘Croisette’ Evening Bag 235320 ECTFN 9583 Gucci ‘G Night’ Evening Bag 247288 EIV0G 6017 Gucci ‘New Pelham’ Evening Bag 223960 A261T 2033 Gucci ‘Sigrid’ Evening Bag 240247 CT00S 1000