如何在.NET中模拟打印机?

如何在.NET中模拟打印机?,.net,mocking,.net,Mocking,我有一个向打印机发送许多PDF的应用程序。是否有人有过创建表示本地打印机的模拟对象的经验?您可以随时暂停打印机进行打印 您可以使用写入文件的打印机设备 您可以编写自己的打印设备。不完全确定您要做什么,但这可能会有所帮助 为了模拟打印机(或任何其他外部设备),您应该将对打印机的所有调用封装在接口后面,例如 interface IPrinter { void Print(PrintData data); } 然后,所有其他代码必须通过此接口与打印机通信 然后,您可以实现一个与真实打印机对话

我有一个向打印机发送许多PDF的应用程序。是否有人有过创建表示本地打印机的模拟对象的经验?

您可以随时暂停打印机进行打印

您可以使用写入文件的打印机设备


您可以编写自己的打印设备。

不完全确定您要做什么,但这可能会有所帮助

为了模拟打印机(或任何其他外部设备),您应该将对打印机的所有调用封装在接口后面,例如

interface IPrinter 
{
   void Print(PrintData data);
}
然后,所有其他代码必须通过此接口与打印机通信

然后,您可以实现一个与真实打印机对话的接口版本,以及一个测试时可以使用的假对象等

伪对象可以很容易地使用或之类的模拟框架进行模拟,或者您可以自己实现一个伪对象

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工具注入打印机类。

另一种解决方案是为自己编写一个LPD应用程序,或者简单地监视端口9100,并让Windows打印队列通过9100或515(LPD)将数据路由到“自身”