Testing Blog
TotT: Keep Your Fakes Simple
Thursday, January 22, 2009
When scientists in California tried to raise condors in captivity, they ran into a problem. The chicks wouldn't eat from the researchers' hands; they wanted a mother condor to feed them. So the scientists got a puppet. To the chicks, it looked like their mother's head was feeding them—but inside was the same scientist's hand.
Consider a contrived example based on that:
TEST_F(BabyCondorTest, EatsCarrion) {
FakeCondor mother;
scoped_ptr
carrion;
BabyCondor* pchick = &chick_;
mother.Imprint(vector
(&pchick, &pchick + 1)); // just one chick
while(!chick_.HasFood()) {
mother.Eat(); // disposes of any food the mother kept for herself
mother.Scavenge(carrion.reset(new FakeCarrion)); // finds new food
mother.RandomlyDistributeFoodAmongYoungAndSelf(); // feeds baby or mom
}
chick_.Eat();
EXPECT_TRUE(carrion->WasEaten());
}
Something is wrong here—that was
a lot of setup!
The general-purpose FakeCondor
replicates too much functionality
from the full class. The researchers' puppet didn't scavenge its own carrion, so why should ours? We just want to test that the baby Eats. We condense various motherhood behaviors, such as giving food, into single method calls by
extracting a role interface
. (If we couldn't change Condor, we would also write an adapter.)
class CondorMotherhoodRoleInterface {
public:
virtual Carrion* GiveFood() = 0;
virtual SomeReturnTypes* OtherMomBehaviors() = 0;
};
Then we write a
single-use fake
which provides
only behaviors we need for this particular test
.
class CondorFeedingPuppet: public CondorMotherhoodRoleInterface {
public:
virtual Carrion* GiveFood() { return test_carrion_; }
virtual SomeReturnTypes* OtherMomBehaviors() { return NULL; }
Carrion* test_carrion_; // public var is tolerable in a one-off object
};
TEST_F(BabyCondorTest, EatsCarrion) {
CondorFeedingPuppet mother; FakeCarrion test_carrion;
mother.test_carrion_ = &test_carrion;
chick_.ReceiveFood(&mother);
chick_.Eat();
EXPECT_TRUE(test_carrion.WasEaten());
}
This
highly-focused fake
is
easy and quick to write
, and makes the test much
simpler
and
more readable
. Don't overestimate the complexity of your dependencies! Often a very simple fake is the best.
Remember to download
this episode
of Testing on the Toilet and post it in your office.
No comments :
Post a Comment
Labels
Aaron Jacobs
1
Adam Porter
1
Alan Faulkner
1
Alan Myrvold
1
Alberto Savoia
4
Alek Icev
2
Alex Eagle
1
Allen Hutchison
6
Andrew Trenk
8
Android
1
Anthony Vallone
25
Antoine Picard
1
APIs
2
App Engine
1
April Fools
2
Arif Sukoco
1
Bruce Leban
1
C++
11
Chaitali Narla
2
Christopher Semturs
1
Chrome
3
Chrome OS
2
Dave Chen
1
Diego Salas
2
Dmitry Vyukov
1
Dori Reuveni
1
Eduardo Bravo Ortiz
1
Ekaterina Kamenskaya
1
Erik Kuefler
3
Espresso
1
George Pirocanac
2
Google+
1
Goranka Bjedov
1
GTAC
54
Hank Duan
1
Harry Robinson
5
Havard Rast Blok
1
Hongfei Ding
1
James Whittaker
42
Jason Arbon
2
Jason Elbaum
1
Jason Huggins
1
Java
5
JavaScript
7
Jay Han
1
Jessica Tomechak
1
Jim Reardon
1
Jobs
14
Joe Allan Muharsky
1
Joel Hynoski
1
John Penix
1
John Thomas
3
Jonathan Rockway
1
Jonathan Velasquez
1
Julian Harty
5
Julie Ralph
1
Karin Lundberg
1
Kaue Silveira
1
Kevin Graney
1
Kirkland
1
Kurt Alfred Kluever
1
Lesley Katzen
1
Marc Kaplan
3
Mark Ivey
1
Mark Striebeck
1
Marko Ivanković
1
Markus Clermont
3
Michael Bachman
1
Michael Klepikov
1
Mike Wacker
1
Misko Hevery
32
Mobile
2
Mona El Mahdy
1
Noel Yap
1
Patricia Legaspi
1
Patrick Copeland
23
Patrik Höglund
5
Peter Arrenbrecht
1
Phil Rollet
1
Philip Zembrod
4
Pooja Gupta
1
Radoslav Vasilev
1
Rajat Dewan
1
Rajat Jain
1
Rich Martin
1
Richard Bustamante
1
Roshan Sembacuttiaratchy
1
Ruslan Khamitov
1
Sean Jordan
1
Sharon Zhou
1
Shyam Seshadri
4
Simon Stewart
2
Stephen Ng
1
Tejas Shah
1
Test Analytics
1
Tony Voellm
2
TotT
54
Vojta Jína
1
WebRTC
2
Yvette Nameth
2
Zhanyong Wan
6
Zuri Kemp
2
Archive
2015
December
November
October
August
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
August
July
June
May
April
March
January
2012
December
November
October
September
August
2011
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
February
January
TotT: Keep Your Fakes Simple
When to use Dependency Injection
TotT: Use EasyMock
Interfacing with hard-to-test third-party code
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
October
September
August
July
June
May
April
March
February
January
Feed
Follow @googletesting
No comments :
Post a Comment