Post on 11-May-2015
description
MockingMaking Writing Unit Tests Your Favorite
Thing to Do
Unit Testing
Your Code
Test
Test
Test
What is Being Unit Tested?• Classes or other component • Public methods• Other methods• Occasionally
• We will refer to the unit as the System Under Test or SUT
The Big Three Requirements• Tests are readable • Tests are trustworthy• Tests are maintainable
Structure of a Unit Test[TestMethod]public void Method_Scenario_Result(){
// Set dependencies, build SUT, set // expectations
// Exercise the SUT
// Check behaviour/state of SUT
// Check that expectations have been met}
Assert
Act
Arrange
Structure of a Unit Test[TestMethod]public void Method_Scenario_Result(){
// Set dependencies, build SUT, set // expectations
// Exercise the SUT
// Check behaviour/state of SUT
// Check that expectations have been met}
Assert
Act
Arrange
No Logic
Tests Should Have No Logic
• No switches, ifs or cases• Only arrange, act, assert
• Test logic == test bugs
[Test]public void CreateNumString_TwoSimpleNumbers_ReturnsStringWithCommaBetween(){ StringCalc sc = new StringCalc(); string result = sc.CreateNumString(1, 2); Assert.AreEqual(String.Format("{0},{1}", x, y), result);}
What is NOT a Unit Test• Tests that require additional, external set up in order
to be run• These are really integration tests
• Tests that require end-to-end functionality• These are really functional tests
Assertions Types• State verification• Method changes SUT state
• Behaviour verification• Verify calls between SUT and collaborator
What do the tests depend on?
• Collaborators• Anything called from the System Under Test
SUT DependancyDependancy
Dependency
Dependency Injection• A 25-dollar term for a 5-cent concept. • Dependency injection means giving an object its
instance variables. • Via James Shore
public class Sample{ private DatabaseThingie myDatabase;
public Sample() { myDatabase = new DatabaseThingie(); }
public void DoStuff() { myDatabase.GetData(); } }
How do we give these instances?
• Constructor injection• Property Injection (setter injection)• Method Injection• Service Locator• Interception framework
Fake it so – Different Kinds of Helpers• Stub – just shut up and help me• minimal behavior
• Mock – tell me when I make a mistake• able to set expectations
• Fake – behave like the real thing, more or less• simplified implementation
• Spy – tell me what happened• record calls
A simple Mocking Example
Expecting Exceptions
Verifying that Calls Were Made
Conditional Mocking
Callbacks
Testing Exceptions