Mocking .NET Without Hurting Its Feelings
class DependenciesHog
{
public string foo
{
get;
set;
}
private void bar(int x)
{
//I do stuff
}
public event BigEvent EventHorizon;
private void SpaceFiller()
{
while (true)
{
LookInteresting();
}
}
}
Why use a Mocking Framework?
Using Hand-Crafted, Artisanal Mocks
John M. Wright
john@wrightfully.com
@wright2tweet
What can they do?
mock.VerifyAllExpectations();
mock.AssertWasCalled(x => x.MyMethod());
A rose by any other name
would smell as sweet
www.wrightfully.com
© Copyright 2017 John M. Wright
How do they do it?
Per Dev:
Per 5 Build Servers:
Code Examples (aka: What can you do?)
Unconstrained Code Examples
Generating Mocks
Example Test using a Mock
Unconstrained Frameworks:
Make Your Own Man-In-The-Middle Attack
Constrained Frameworks:
Limitations of Class Inheritance
Constrained Frameworks:
Class Inheritance On-Demand
internal types & members
Mocking Internal Types/Members
AssemblyInfo.cs
[assembly: InternalsVisibleTo("Your.TestAssembly")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
sealed types
Generated Classes:
- Inherit / Extend Mocked Type
- Override virtual/abstract members
- Check for configured stubs/mocks
- Save details for later verification
- Take action based on configuration
Code Examples (aka: What can you do?)
ICorProfilerInfo::
SetILFunctionBody
Hijacked Code:
- Can change Behavior of ANY Type/Member
- Doesn't rely on inheritance
- Everything gets JIT'd, so anything can be mocked!
- Injected code will:
- Check for configured stubs/mocks
- Save details for later verification
- Take action based on configuration
Internal Dev Team Meetup
July, 2017
- .NET libs
- 3rd Party libs (Sharepoint)
Alternate Implementations
Creating and Checking Expectations
methods, properties, events
- Open source
- No extra software needed
- Limited commercial support
- May require design compromises
- Proprietary (closed source)
- Some require profiler application / VS plugin
- Commercial support
class DatabaseConnection
{
}
More Info @
wrightfully.com/mocktalk
http://mimiandeunice.com/2011/07/19/expectations/
Using A Mocking Framework
$$$
UI
$$
Integration
$
Unit Tests
class DatabaseConnection
{
}
Great for testing "legacy" code.
Best fit for code written with testing in mind.
Return Value Based On Input
virtual / abstract members
class DependenciesHog
{
public string foo
{
get;
set;
}
private void bar(int x)
{
//I do stuff
}
public event BigEvent EventHorizon;
private void SpaceFiller()
{
while (true)
{
LookInteresting();
}
}
}