c# mvc website pdf file in stored in byte array display in browser : Cut pages out of pdf online control software platform web page windows .net web browser The%20Art%20of%20Unit%20Testing%20with%20Examples%20in%20.NET%20(Manning%202009)9-part1070

Refactoring our design to be more testable
65
{
manager = new FileExtensionManager();
}
public IExtensionManager ExtensionManager
      
get { return manager; }
set { manager = value; }
public bool IsValidLogFileName(string fileName)
{
return manager.IsValid(fileName);
}
}
[Test]
Public void 
IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse()
{
//set up the stub to use, make sure it returns true
...
//create analyzer and inject stub
LogAnalyzer log = 
new LogAnalyzer ();
log.ExtensionManager=someFakeManagerCreatedEarlier;
//Assert logic assuming extension is supported
...
}
}
Like constructor injection, property injection has an effect on the API 
design in terms of defining which dependencies are required and which 
aren’t. By using properties, you’re effectively saying, “This dependency 
isn’t required to operate this type.”
When you should use property injection
Use this technique when you want to signify that a dependency of the 
class under test is optional, or if the dependency has a default instance 
created that doesn’t create any problems during the test.
Allows setting 
dependency  
via a property
Injects stub 
Cut pages out of pdf online - remove PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provides Users with Mature Document Manipulating Function for Deleting PDF Pages
copy pages from pdf into new pdf; delete page in pdf preview
Cut pages out of pdf online - VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Visual Basic Sample Codes to Delete PDF Document Page in .NET
delete page pdf file; delete a page from a pdf acrobat
66
CHAPTER 3    Using stubs to break dependencies
3.4.5 Getting a stub just before a method call
This  section  deals  with  a  scenario  where  you  get  an  instance  of  an 
object just before you do any operations with it, instead of getting it via 
a constructor or a property. The difference is that the object initiating 
the stub request in this situation is the code under test; in previous sec-
tions, the stub instance was set by code external to the code under test 
before the test started.
Use a factory class
In this scenario, we go back to the basics, where a class initializes the 
manager in its constructor, but it gets the instance from a factory class. 
The Factory pattern is a design that allows another class to be respon-
sible for creating objects. 
Our tests will configure the factory class (which, in this case, uses a 
static method to return an instance of an object that implements 
IEx-
tensionManager
) to  return a  stub  instead of  the real implementation. 
Figure 3.7 shows this.
This is a clean design, and many object-oriented systems use factory 
classes  to  return  instances  of  objects.  But  most  systems  don’t  allow
Figure 3.7 A test configures the factory class to return a stub object. The class under 
test uses the factory class to get that instance, which in production code would 
return an object that isn’t a stub. 
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Image: Copy, Paste, Cut Image in Page. Link: Edit URL. Bookmark can view PDF document in single page or continue pages. Support to zoom in and zoom out PDF page.
delete pages from pdf file online; delete page from pdf acrobat
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Remove Image from PDF Page. Image: Copy, Paste, Cut Image in can view PDF document in single page or continue pages. Support to zoom in and zoom out PDF page.
delete pages on pdf file; copy pages from pdf to word
Refactoring our design to be more testable
67
anyone outside the factory class to change the instance being returned, 
in order to protect the encapsulated design of this class.
In this case, I’ve added a new setter method (our new seam) to the fac-
tory class so that our tests will have more control over what instance 
gets returned. Once you introduce statics into test code, you might also 
need  to  reset  the  factory state  before or after each test run, so  that 
other tests won’t be affected by the configuration.
This  technique produces test code  that’s easy to  read,  and there’s  a 
clear separation of concerns between the classes. Each one is responsi-
ble for a different action.
Listing 3.6 shows code that uses the factory class in 
LogAnalyzer
(and 
also includes the tests).
Listing 3.6  Setting a factory class to return a stub when the test is running
public class LogAnalyzer
{
private IExtensionManager manager;
public LogAnalyzer ()
{
manager = ExtensionManagerFactory.Create();
}
public bool IsValidLogFileName(string fileName)
{
return manager.IsValid(fileName)
&& Path.GetFileNameWithoutExtension(fileName).Length>5;
}
}
[Test]
Public void 
IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse()
{
//set up the stub to use, make sure it returns true
...
Uses factory  in  
production code
VB.NET Image: Image Cropping SDK to Cut Out Image, Picture and
and easy to use .NET solution for developers to crop / cut out image file This online tutorial page will illustrate the image cropping function from following
delete page on pdf file; delete pages of pdf
VB.NET PDF Text Extract Library: extract text content from PDF
Extract highlighted text out of PDF document. Best VB.NET PDF text extraction SDK library and component for Online Visual Basic .NET class source code for quick
add or remove pages from pdf; delete page on pdf reader
68
CHAPTER 3    Using stubs to break dependencies
ExtensionManagerFactory
.SetManager(myFakeManager);
//create analyzer and inject stub
LogAnalyzer log = 
new LogAnalyzer ();
//Assert logic assuming extension is supported
...
}
}
Class ExtensionManagerFactory
{
Private IExtensionManager customManager=null;
Public IExtensionManager Create()
{
If(customManager!=null)
return customManager;    
Return new FileExtensionManager();
}
Public void SetManager(IExtensionManager mgr)
{
customManager = mgr;
}
}
The  implementation  of  the  factory  class  can  vary  greatly,  and  the 
examples shown here represent only the simplest illustration. For more 
examples of factories, read about the factory method and the Abstract 
Factory Design patterns in the classic book 
Design Patterns
, by the Gang 
of Four (Erich Gamma, Richard Helm, Ralph Johnson, and John M. 
Vlissides).
The only thing you need to make sure of is that, once you use these pat-
terns, you add a seam to the factories you make so that they can return 
your stubs instead of the default implementations. Many systems have 
a global 
#debug
switch that, when turned on, causes seams to automati-
cally send  in  fake  or  testable  objects  instead of  default  implementa-
tions. Setting this up can be hard work, but it’s worth it when it’s time 
to test the system.
Sets stub into 
factory class  
for this test
Defines factory that can use  
and return custom manager
C# PDF Text Extract Library: extract text content from PDF file in
Free online source code for extracting text from adobe Ability to extract highlighted text out of PDF C# example code for text extraction from all PDF pages.
delete a page from a pdf in preview; delete page pdf online
VB.NET PDF - View PDF with WPF PDF Viewer for VB.NET
Image from PDF Page. Image: Copy, Paste, Cut Image in PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET Abilities to zoom in and zoom out PDF page.
delete pdf pages reader; delete page in pdf document
Refactoring our design to be more testable
69
Hiding seams in release mode
What if you don’t want the seams to be visible in release mode? There 
are several ways to achieve that. In .NET, for example, you can put the 
seam statements (the added constructor, setter, or factory setter) under 
a conditional compilation argument, like this:
#if DEBUG
MyConstructor(IExtensionManager mgr)
{...}
#endif
There’s also a special attribute in .NET that can be used for these pur-
poses:
[Conditional("DEBUG")]
MyConstructor(IExtensionManager mgr)
{...}
When you should use conditional compilation
First, you need to realize that we’re dealing with a different layer depth 
here than the previous sections. At each different depth, we’re faking
(or stubbing) a different object. Table 3.1 shows three layer depths that 
are used inside the code to return stubs.
Table 3.1 Layers of code that can be faked
Code under test
Possible action
Layer depth 1:  
the FileExtensionManager  
variable inside the class
Add a constructor argument that will be used as the 
dependency. A member in the class under test is now 
fake; all other code remains unchanged.
Layer depth 2: the dependency returned 
from the factory class into the class under 
test
Tell the factory class to return your fake dependency by 
setting a property. The member inside the factory class is 
fake; the class under test isn’t changed at all.
Layer depth 3: the factory class that returns 
the dependency
Replace the instance of the factory class with a fake fac-
tory that returns your fake dependency. The factory is a 
fake, which also returns a fake; the class under test isn’t 
changed.
C# WPF PDF Viewer SDK to view PDF document in C#.NET
Image from PDF Page. Image: Copy, Paste, Cut Image in PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET Abilities to zoom in and zoom out PDF page.
delete page from pdf reader; add and delete pages in pdf
C# PDF Form Data fill-in Library: auto fill-in PDF form data in C#
Free online C# sample code can help users to fill in fill in form field in specified position of adobe PDF file. Able to fill out all PDF form field in C#.NET.
delete a page from a pdf; acrobat export pages from pdf
70
CHAPTER 3    Using stubs to break dependencies
The thing to understand about layers of indirection is that the deeper 
you go down the rabbit hole (down the code-base execution call stack) 
the  better  manipulation  power  you  have  over  the  code  under  test, 
because you create stubs that are in charge of more things down the 
line. But there’s also a bad side to this: the further you go down the lay-
ers, the harder the test will be to understand, and the harder it will be 
to find the right place to put your seam. The trick is to find the right 
balance between complexity and manipulation power so that your tests 
remain readable but you get full control of the situation under test.
For the scenario in listing 3.6 (using a factory), adding a constructor-
level argument would complicate things when we already have a good 
possible target layer for our seam—the factory at depth 2. Layer 2 is 
the simplest to use here because the changes it requires in the code are 
minimal: 
Layer 1 (faking a member in the class under test)
You would need to add a constructor, set the class in the construc-
tor, set its parameters from the test, and worry about future uses of 
that  API  in  the  production  code.  This  method  would  change  the 
semantics of using the class under test, which is best avoided unless 
you have a good reason.
Layer 2 (faking a member in a factory class)
This method is easy. Add a setter to the factory and set it to a fake 
dependency of your choice. There’s no changing of the semantics of 
the code base, everything stays the same, and the code is dead sim-
ple. The only con is that this method requires that you understand 
who calls the factory and when, which means you need to do some 
research before you can implement this easily. Understanding a code 
base you’ve never seen is a daunting task, but it still seems more rea-
sonable than the other options.
Layer 3 (faking the factory class)
You would need to create your own version of a factory class, which 
may or may not have an interface. This means also creating an inter-
face for it. Then you would need to create your fake factory instance, 
tell  it  to  return  your  fake  dependency  class  (a  fake  returning  a 
VB.NET PDF- HTML5 PDF Viewer for VB.NET Project
Remove Image from PDF Page. Image: Copy, Paste, Cut Image in NET comment annotate PDF, VB.NET delete PDF pages, VB.NET PDF page and zoom in or zoom out PDF page
delete pages pdf files; delete pdf pages
VB.NET PDF - WPF PDF Viewer for VB.NET Program
Image from PDF Page. Image: Copy, Paste, Cut Image in Online Guide for Using RasterEdge WPF PDF Viewer to View PDF pages, zoom in or zoom out PDF pages and go to
delete pages from pdf reader; delete page from pdf
Refactoring our design to be more testable
71
fake—take note!), and then set the fake factory class on the class 
under test. A fake returning a fake is always a bit of a mind-boggling 
scenario, which is best avoided because it makes the test less under-
standable.
Use a local factory method (Extract and Override)
This method doesn’t reside in any of the layers listed in table 3.1; it cre-
ates a whole new layer of indirection close to the surface of the code 
under test. The closer we get to the surface of the code, the less we need 
to  muck  around  with  changing  dependencies. In  this case,  the  class 
under test is also a dependency of sorts that we need to manipulate. 
In this scenario, we use a local 
virtual
method in the class under test as a 
factory  to  get  the  instance  of  the  extension  manager.  Because  the 
method is marked as 
virtual
, it can  be overridden in  a  derived  class, 
which creates our seam. We inject a stub into the class by 
inheriting 
new  class  from  the  class  under  test, 
overriding
the  virtual  factory 
method, and finally returning whatever instance the new class is con-
figured  to  return  in  the  overriding  method.  The  tests  are then  per-
formed  on  the new  derived class.  The factory method could also be 
called a stub method that returns a stub object. Figure 3.8 shows the 
flow of object instances.
Figure 3.8 We inherit from the class under test so we can override its virtual factory 
method and return whatever object instance we want, as long as it implements IEx-
tensionManager. Then we perform our tests against the newly derived class.
Listing 3.7  Faking a factory method
public class LogAnalyzerUsingFactoryMethod
{
public bool IsValidLogFileName(string fileName)
{
return GetManager().IsValid(fileName);
}
protected virtual IExtensionManager GetManager()
{
return new FileExtensionManager();
}
Uses virtual  
GetManager()
method
Returns  
hardcoded  
{
//no change from the previous samples
...
}
The technique we’re using here is called 
Extract and Override
, and you’ll find 
it extremely easy to use once you’ve done it a couple of times. It’s a pow-
erful technique, and one I will put to other uses throughout this book.
TIP
You  can  learn  more  about  this  dependency-breaking  technique  and 
others in a book I have found to be worth its weight in gold: 
Working 
Effectively with Legacy Code
by Michael Feathers.
Extract  and  Override  is  a  powerful  technique  because  it  lets  you 
directly  replace  the  dependency without  going  down the rabbit hole 
(changing dependencies deep inside the call stack). That makes it quick 
Creates instance of 
class derived from 
class under test
Returns  
what we  
tell it to
74
CHAPTER 3    Using stubs to break dependencies
and clean to perform, and it almost corrupts your good sense of object-
oriented aesthetics, leading you to code that might have fewer inter-
faces but more virtual methods. I like to call this method “ex-crack and 
override” because it’s such a hard habit to let go of once you know it.
When you should use this method
Extract and Override is great for simulating 
inputs
into your code under 
test, but it’s cumbersome when you want to verify interactions that are 
coming 
out
of
the code under test into your dependency. 
For example, it’s great if your test code calls a web service and gets a 
return value
, and you’d like to simulate your own return value. But it gets 
bad quickly if you want to test that your code 
calls
out
to the web service 
correctly. That requires lots of manual coding, and mock frameworks
are  better  suited  for  such  tasks  (as  you’ll  see  in  the  next  chapter). 
Extract and Override is good if you’d like to simulate return values or 
simulate whole interfaces as return values, but not for checking inter-
actions between objects. 
I use this technique a lot when I need to simulate inputs into my code 
under test, because it helps keep the changes to the semantics of the 
code base (new interfaces, constructors, and so on) a little more man-
ageable. You need to make fewer of them to get the code into a testable 
state. The only times I don’t use this technique is when the code base 
clearly shows that there’s a path already laid out for me: there’s already 
an interface ready to be faked or there’s already a place where a seam
can be injected. When these things don’t exist, and the class itself isn’t 
sealed (or can be made nonsealed without too much resentment from 
your peers), I check out this technique first, and only after that move 
on to more complicated options.
There are many variations on the preceding simple techniques to intro-
duce 
seams
into source code. For example, instead of adding a parame-
ter to a constructor, you can add it directly to the method under test. 
Instead of sending in an interface, you could send a base class, and so 
on. Each variation has its own strengths and weaknesses.
3.5 Variations on refactoring techniques
Documents you may be interested
Documents you may be interested