【问题标题】:Mocking PrintQueue in .NET在 .NET 中模拟 PrintQueue
【发布时间】: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


【解决方案1】:

解决问题需要提取和实现一些“部分”接口。

/// <summary>
/// Contract for PrintCapabilities
/// </summary>
public interface IPrintCapabilities
{
    /// <summary>
    /// Gets CollactionCapability.
    /// </summary>
    IEnumerable<Collation> CollationCapability { get; }

    /// <summary>
    /// Gets MaxCopyCount.
    /// </summary>
    int? MaxCopyCount { get; }

    /// <summary>
    /// Gets OrientedPageMediaHeight.
    /// </summary>
    double? OrientedPageMediaHeight { get; }

    /// <summary>
    /// Gets OrientedPageMediaWidth.
    /// </summary>
    double? OrientedPageMediaWidth { get; }

    /// <summary>
    /// Gets PageMediaSizeCapability.
    /// </summary>
    IEnumerable<PageMediaSize> PageMediaSizeCapability { get; }

    /// <summary>
    /// Gets PageOrientationCapability.
    /// </summary>
    IEnumerable<PageOrientation> PageOrientationCapability { get; }

    /// <summary>
    /// Gets DuplexingCapability.
    /// </summary>
    IEnumerable<Duplexing> DuplexingCapability { get; }

    /// <summary>
    /// Gets InputBinCapability.
    /// </summary>
    IEnumerable<InputBin> InputBinCapability { get; }

    /// <summary>
    /// Gets OutputColorCapability.
    /// </summary>
    IEnumerable<OutputColor> OutputColorCapability { get; }

    /// <summary>
    /// Gets PageOrderCapability.
    /// </summary>
    IEnumerable<PageOrder> PageOrderCapability { get; }

    /// <summary>
    /// Gets StaplingCapability.
    /// </summary>
    IEnumerable<Stapling> StaplingCapability { get; }
}

/// <summary>
/// Contract for PrintQueue
/// </summary>
public interface IPrintQueue
{
    /// <summary>
    /// Gets IsOffline flag.
    /// </summary>
    bool IsOffline { get; }

    /// <summary>
    /// Gets FullName.
    /// </summary>
    string FullName { get; }

    /// <summary>
    /// Refreshes PrintQueue.
    /// </summary>
    void Refresh();

    /// <summary>
    /// Gets or sets DefaultPrintTicket.
    /// </summary>
    IPrintTicket DefaultPrintTicket { get; set; }

    /// <summary>
    /// Gets PrintCapabilities.
    /// </summary>
    /// <returns></returns>
    IPrintCapabilities GetPrintCapabilities();
}

/// <summary>
/// Contract for PrintQueueCollection.
/// </summary>
public interface IPrintQueueCollection : IEnumerable
{
}

/// <summary>
/// Interface that describes all classes implementing PrintServer operations.
/// </summary>
public interface IPrintServer
{
    /// <summary>
    /// Gets the collection of print queues of the specific types.
    /// </summary>
    /// <param name="enumerationFlag">Array of types of print queues.</param>
    /// <returns>Print queues collection.</returns>
    IPrintQueueCollection GetPrintQueues(EnumeratedPrintQueueTypes[] enumerationFlag);

    /// <summary>
    /// Returns a reference of default print queue of LocalPrintServer.
    /// </summary>
    /// <returns>Print queue.</returns>
    IPrintQueue GetDefaultPrintQueue();
}

/// <summary>
/// Contract for PrintTicket
/// </summary>
public interface IPrintTicket
{
    /// <summary>
    /// Gets or sets PageOrientation.
    /// </summary>
    PageOrientation? PageOrientation { get; set; }

    /// <summary>
    /// Gets or sets Duplexing.
    /// </summary>
    Duplexing? Duplexing { get; set; }

    /// <summary>
    /// Gets or sets Stapling.
    /// </summary>
    Stapling? Stapling { get; set; }

    /// <summary>
    /// Gets or sets PageOrder.
    /// </summary>
    PageOrder? PageOrder { get; set; }

    /// <summary>
    /// Gets or sets OutputColor.
    /// </summary>
    OutputColor? OutputColor { get; set; }

    /// <summary>
    /// Gets or sets Collation.
    /// </summary>
    Collation? Collation { get; set; }

    /// <summary>
    /// Gets or sets PageMediaSize.
    /// </summary>
    PageMediaSize PageMediaSize { get; set; }
}

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多