Introducing 

Prezi AI.

Your new presentation assistant.

Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.

Loading…
Transcript

Mocking .NET Without Hurting Its Feelings

Northeast Wisconsin

Code Camp

March 24th, 2018

https://www.ftc.gov/news-events/media-resources/truth-advertising/advertisement-endorsements

As per the FTC’s Guides Concerning the Use of Endorsements and Testimonials in Advertising:

Please be aware that I have received a Community license, at no cost to me, for Typemock Isolator, due to involvement in the development community and my writing/speaking on mocking topics.

Legal Disclaimer

wrightfully.com/mocktalk

John M. Wright

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();

}

}

}

My test

value

john@wrightfully.com

Why use a Mocking Framework?

Using Hand-Crafted, Artisanal Mocks

@wright2tweet

www.wrightfully.com

© Copyright 2018 John M. Wright

mock

test double

What can they do?

mock.VerifyAllExpectations();

mock.AssertWasCalled(x => x.MyMethod());

mock

vs

stub

vs

stub

A rose by any other name

would smell as sweet

work about the same

mock types

How do they do it?

Per 5 Build Servers:

as of 2018-01-22

Code Examples (aka: What can you do?)

Code being tested

Example Test using a Mock

Using Moq Syntax

Unconstrained Code Examples

Typemock Syntax

Code being tested

MS Fakes Syntax

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

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

The New Guy In Town

$ $ $

DateTime.Now

All that, plus:

  • public
  • internal
  • methods
  • properties
  • events
  • static
  • sealed
  • private
  • .NET libs
  • 3rd Party libs (Sharepoint)

Mock

What can

I expect?

private members

JITCompilationStarted

dynamic

Unconstrained

Constrained

public types & members

More Info @

wrightfully.com/mocktalk

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

{

}

substitute

http://mimiandeunice.com/2011/07/19/expectations/

static types & members

shim

class AnotherOne

{

}

Using A Mocking Framework

Custom Mocks

File I/O

$$$

UI

$$

Integration

$

Unit Tests

FREE

158 members!

partial

Unconstrained

.VerifyAll()

class DatabaseConnection

{

}

Great for testing "legacy" code.

Best fit for code written with testing in mind.

Class Being Tested

interfaces

fake

Tests

virtual / abstract members

strict

Constrained

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();

}

}

}

Learn more about creating dynamic, engaging presentations with Prezi