【发布时间】:2014-07-19 08:50:05
【问题描述】:
需要模拟 System.Printing.PrintQueue 进行一些测试。目前,我在尝试为可能存在的虚拟打印机创建 PrintQueue 时遇到此错误(new PrintQueue(new PrintServer(), "Microsoft XPS Document Writer")):
System.Printing.PrintQueueException: PrintTicket provider failed to bind to printer. Win32 error: -2147467231
at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion)
at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion)
at System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion)
at System.Printing.PrintQueue.GetPrintCapabilities()
请注意,该错误与缺少打印机无关。
我可以使用 Fakes 填充位于堆栈顶部的 PrintTicket,但绝对不清楚哪个方法正在抛出。 PrintQueue 不是托管类(位于 PrintQueue.cpp 中)。有什么想法吗?
编辑
谷歌了一下,仍然没有解决这个问题:
https://connect.microsoft.com/VisualStudio/feedback/details/690455/printqueue-getprintcapabilities-throws-when-incorrect-driver-is-configured-for-printer-on-print-server
http://www.infragistics.com/community/forums/t/50736.aspx
http://petterisbetter.com/michael/index.php/2008/09/29/printticket-provider-failed-to-retrieve-
【问题讨论】:
-
如果你不能测试它,那么你总是可以创建一个你可以模拟的“包装类”......它不像直接模拟对象那么纯粹,但它会很快解决问题。
-
@DavidKirkland 如果返回的对象有一些通用接口和/或默认构造函数,我会很乐意这样做。
-
创建自己的 IPrintTicket 接口并将返回的对象包装在实现它的类中是否可行?我认为有一些常见的信息被返回。也许我在这里误解了确切的细节,但你仍然应该能够包装返回类型......
标签: c# .net unit-testing printing mocking