Sign in
|
Join
ISerializable - Roy Osherove's Blog
Unit Testing, Agile Development, Leadership & .NET - By Roy Osherove
This Blog
Home
About
Syndication
RSS
Atom
Comments RSS
Search
Go
Navigation
Home
Blogs
News
My new book is out!
The Art Of Unit Testing
Buy and read it as I write it.
I work at:
Your ad here
The Art Of Unit Testing Book
Roy's Cool Tools
Subscribe!
Subscribe to ISerializable by Email
About
Hire me
Ask me
On my bookshelf
About me
Ego trip
Roy's Tools
5 Whys - a blog for team leaders
Key.bo - a search engine wiki for keyboard shortcuts
unit testing
ruby styff
All Developer Songs
It's Time for Violence
Que Sera Sera
Articles
3: Oops! Typed Datasets
Are
scalable!
4: Introduction To Regular Expressions
5: Practical Parsing Using Groups in Regular Expressions
6: UI Threading Helper Classes
Make Your App Support Plugins 2 - Dynamic Search (MSDN)
Winforms Data Binding Lessons Learned
Make Your App Support Plugins (MSDN)
1: Introduction to Typed Datasets
2: Typed Datasets Are No Silver Bullet
My articles on MSDNAA
7: Solving VS.NET Debugger Problems
Make your log files searchable using Regex and the XML classes (MSDN)
Introduction to TDD with NUnit
Fun with Unit Tests – Testing abstract classes
New: Creating a generic Site-To-RSS tool
.Net scripting
- the practical way
Simplified Database Unit testing using Enterprise Services
Creating custom test attributes easily with NUnit 2.2.1
Cool tools every .Net Dev should be aware of
Cool Tools every .Net developer should be aware of
New: The case for staged delivery and Agile methodologies
My .Net Deep Dive lectures on video
New: Defensive event publishing in .Net, part 1
Test Feasibility Matrix
Depenedency Breaking Issues
*new* Achieving And Recognizing Testable Software Designs – Part I
Favorite Blogs
The Morning Brew
Martin Fowler
Scott Hanselman
Joel On Software
.NET Weblogs
Microsoft Israel Community
The Runtime
Daniel Moth
Oren Eini
Jimmy Bogard
CodeBetter
Dustin Campbell
Guy Kawasaki
Stephen Toub
Research @ Intel
Udi Dahan
The Typemock Insider
My Projects
Vs.Net Settings import.export Add-in
SchemaHelper - auto-detect & create data relations
Proxy handling using ProxyFactory and ProxyInfo
BackgroundWorker implementation
XtUnit: An Unofficial Unit Testing Extensibility Framework - Add new attributes to NUnit or MbUnit e
Intercetpion Application Block
Extensibility Application Block
The Regulator
VS.Net 2003 registry tweaker
My Tools page
Regular Expressions
RegEx Lib
Expresso
Regex Blogs
Sites : .Net
.Net Tools List
.NetWebLogs Forums
Winforms FAQ
.Net Debugging Resources
.Net WebCasts & Others
.NetWeblogs Archive
MSDN Magazine
Design Patterns in C#
.Net Rocks Radio
.Net Resources
Howto: .Net common tasks
VB.Net blogs on MSDN
.NetSlackers
Sites : Misc
Regular Expression Library
MSR Downloads
Win2k3 Tweak Guide
About Microsoft Interviews
Tech Interview Riddles
Feedster
Amazon Light
C:\Utils
Sites : Unit Testing & XP
NUnitASP
Tips and techniques with NUnit
NUnit
NUnit Addin
XProgramming
MSDN Mag:Simplify Data Layer Unit Testing using Enterprise Services
Tags
.NET
.Net 2.0
.Net Original
.Net Quotations
.NetWeblogs Site
Addin Contest
ADO.Net
Agile
Agile Israel News
Agile Related
altnet
altnetconf
altnetisrael
Architecture
Art Of Unit Testing
ASP.NET
BDD
Blogging
C#
CLR
Community
Community News
Cool Articles
Cool sites
Cool Tools
Extensibility
Family
FeatureFocus
Free book chapters
General Software Development
Interview
Lean
Mobile
MSBuild
NDC09-Video
Off Topic
Open Source
Other
Product Reviews
Project Management
racer
Recommended books
Reflection
Regex
Regular Expressions
review
Security
Sharepoint
Silverlight
SOA
Songs
SQL Server
tdd
Team Agile News
Team System
TechEd 05
Testing Guidelines
TestReview
Threading
Tips & Tricks
Typed Datasets
Typemock
Unit Testing
Visual Studio
web
web services
WebCast
Windows Forms
WinFX
Recent Posts
How to: Move your blog off of weblogs.asp.net (aka ‘This Blog has moved’)
test – ignore
Bounty: 500$ is you can convert my blog to squarespace
Join me for a live webinar on unit testing with Isolator++ this thursday
What’s coming in Test Lint 1.5
Archives
November 2010 (2)
October 2010 (4)
September 2010 (4)
August 2010 (3)
July 2010 (2)
June 2010 (5)
May 2010 (6)
April 2010 (6)
March 2010 (4)
February 2010 (5)
January 2010 (11)
December 2009 (7)
November 2009 (7)
October 2009 (5)
September 2009 (6)
August 2009 (21)
July 2009 (7)
June 2009 (11)
May 2009 (13)
April 2009 (5)
March 2009 (21)
February 2009 (4)
January 2009 (2)
December 2008 (5)
November 2008 (6)
October 2008 (13)
September 2008 (4)
August 2008 (13)
July 2008 (19)
June 2008 (5)
May 2008 (17)
April 2008 (11)
March 2008 (13)
February 2008 (16)
January 2008 (21)
December 2007 (8)
November 2007 (18)
October 2007 (17)
September 2007 (15)
August 2007 (19)
July 2007 (18)
June 2007 (33)
May 2007 (16)
April 2007 (10)
March 2007 (15)
February 2007 (10)
January 2007 (11)
December 2006 (22)
November 2006 (18)
October 2006 (19)
September 2006 (30)
August 2006 (19)
July 2006 (27)
June 2006 (26)
May 2006 (32)
April 2006 (15)
March 2006 (20)
February 2006 (33)
January 2006 (23)
December 2005 (22)
November 2005 (41)
October 2005 (21)
September 2005 (7)
August 2005 (28)
July 2005 (41)
June 2005 (60)
May 2005 (14)
April 2005 (51)
March 2005 (31)
February 2005 (17)
January 2005 (63)
December 2004 (45)
November 2004 (35)
October 2004 (28)
September 2004 (36)
August 2004 (21)
July 2004 (44)
June 2004 (63)
May 2004 (62)
April 2004 (78)
March 2004 (64)
February 2004 (55)
January 2004 (67)
December 2003 (34)
November 2003 (67)
October 2003 (68)
September 2003 (113)
August 2003 (56)
July 2003 (112)
June 2003 (71)
May 2003 (136)
April 2003 (52)
March 2003 (81)
February 2003 (77)
Use Mock Logs instead of expectations when it makes sense
My blog has moved. You can view this post at the following address:
http://www.osherove.com/blog/2005/6/18/use-mock-logs-instead-of-expectations-when-it-makes-sense.html
Published
Saturday, June 18, 2005 3:49 PM by
RoyOsherove
Filed under:
Agile Related
,
Testing Guidelines
Comments
Saturday, June 18, 2005 9:10 AM by
Len Holgate
#
re: Use Mock Logs instead of expectations when it makes sense
Why is the 'Expect' way better?
I'm curious since I haven't used mocks that work that way.
My gut reaction is that given a change to a complex object under test you'd have to make more changes to the test than I would. ;) Purely because your expectations are embedded in code whereas my expectations are in a text log and the mock can write out a new list of expectations when the test breaks so all you need to do is check that it's correct and switch to using the new log...
Saturday, June 18, 2005 11:05 AM by
Roy Osherove
#
re: Use Mock Logs instead of expectations when it makes sense
I rather like the readability of the "Expect" syntax over comparing logs.
- When you have an expected log text on disk - the test reader needs to manually open the text file to see what is the series of events that is expected to happen.
- Also - because the Mock always logs *all* calls - the expected log text usually also contains events from totally different scenarios making it less readable and less focused on the current test. That means that If I want know that my object gets the "X" method called - I don't care that "Z" and "Y" are called as well, but with the log - I'd have to write that just as well o my test would break.
-With "Expect" you can surgically select what you want to happen - which discards the test reader from asking themselves "Why is he expecting 'Y' in this test?" and also makes for the intent of the test be more visible. Also both test and expectations are in the same place, and expectations are shorter.
In summary, in both cases, when tests break you need to change something - either that test code of the expect log text, only in the log case.taking that into account - I'd rather 'Expect" if it's not too much of a hassle.
Sunday, June 19, 2005 6:22 AM by
Len Holgate
#
re: Use Mock Logs instead of expectations when it makes sense
Fair enough.
I don't quite understand the 'surgically select' part? Are you saying that if you're testing a scenario in which an object uses a service provider to "GetData()" you can tell your mock to expect a single call to "GetData()" and then if the object under test actually calls "DoThing()" on the mock before and after the call to "GetData()" the test can still pass? And you'd consider that a valid way for the test to pass?
If so, why aren't you interested in all of the interaction that occurs during the scenario under test?
I find the fact that the mocks involved log all interaction for a particular scenario (or state of a scenario if I validate the logs at various points in the test case) helps imensely to lock down object interaction and draw attention to unexpected behaviour.
I agree that having the expectations inline helps make the intent of the test more obvious. That was always the main issue that I had with the logs.
Still, horses for courses. I'm working on some auto generated mocks at present and I'm currently adding a form of 'expect' syntax to them as it's reasonably easy to generate alongside the logging functionality.
Sunday, June 19, 2005 6:34 AM by
Roy Osherove
#
re: Use Mock Logs instead of expectations when it makes sense
Len:
"And you'd consider that a valid way for the test to pass?
If so, why aren't you interested in all of the interaction that occurs during the scenario under test? "
I usually try to test only one thing in my unit tests. That one thing may be that a correct and *single* interaction occurs on the class under test.
Other interactions that occur may happen because of different application logic that should or should not happen and that is probably tested elsewhere.
The point is - I can ignore or I can choose to not ignore other interaction.
It all depends on the scenario I'm testing. Some scenarios might call to test lots of interactions on the same object and some not.
An example might be in order: Say you have an object that, upon calling method "foo" should do several things:
- Write a log to to a logger object (with complex logging logic)
- Send an email if some parameters are valid (using an emailer object)
- Throw an exception if one of several validations fails (one test each?)
- pass down a message to a data layer object with various parameters.
With logging - practically all of these (except for maybe the third one, as it's not interaction) have to be tested throughout all the tests for that method. There is not way to write a test for just one of those constraints.
With Mocks I can certainly do that - test each rule with one or more tests and ignore the others. That one, if one of the "rules" fails to correctly do its job, only some of my tests will fail but the rest will pass (telling me exactly what I should be focusing on).
Usually mocks have the ability to be "Strict" or non strict where in strict mode only the expected interactions should occur and anything else unexpected thrown an exception. the non strict mode allows me to "select" the interaction I care about.
Sunday, June 19, 2005 8:34 AM by
Len Holgate
#
re: Use Mock Logs instead of expectations when it makes sense
OK, I understand. Good example. Though I would imagine we'd be talking about several mocks, one to represent each of the services that's being used. In that situation testing just the email functionality would mean ignoring the logs from the other mocks during that test...
Anyway, I understand where you're coming from and I'm interested enough to investigate adding this kind of functionality to some of my mocks to see how I get on with it (step one, work out how to do it in such a way that I don't have to spend an age writing it by hand for each mock that I want to use it with ;) )
Sunday, June 19, 2005 8:52 AM by
Roy Osherove
#
re: Use Mock Logs instead of expectations when it makes sense
Len:
Yes - you would probably be using several mocks in the above example which makes it a little irrelevant. However, it's quite easy to make that into an example where there are several logical expectations on one mock object, that you would much rather separate into several different unit tests. For example - make sure that the Mailer object is called with the "SendEmail" method, but that the "AddAttachement" method is called or not called depending on various logical behavior etc.