Не совсем уверен, что вы пытаетесь сделать, но это может помочь.
Чтобы макетировать принтер (или любое другое внешнее устройство), вы должны инкапсулировать все вызовы к принтеру за интерфейсом, например,
interface IPrinter
{
void Print(PrintData data);
}
Затем весь ваш другой код должен общаться с принтером через этот интерфейс.
Затем можно реализовать одну версию этого интерфейса, которая взаимодействует с реальным принтером, и один поддельный объект, который можно использовать при тестировании и т. Д.
Поддельный объект может быть легко смоделирован с использованием насмешливого фреймворка, например Rhino Mocks или Moq , или вы можете просто создать поддельный объект самостоятельно.
public class FakePrinter : IPrinter
{
public void Print(PrintData data)
{
// Write to output window or something
}
}
Обновление:
Все классы, которые используют принтер, будут выглядеть примерно так:
public class ClassThatPrints
{
private IPrinter _Printer;
// Constructor used in production
public ClassThatPrints() : this(new RealPrinter())
{
}
// Constructor used when testing
public ClassThatPrints(IPrinter printer)
{
_Printer = printer;
}
public void MethodThatPrints()
{
...
_Printer.Print(printData)
}
}
Кстати, если вы используете контейнер IoC, тогда вам не нужен первый конструктор. Затем вы вводите классы принтера с помощью инструмента IoC.