2012-10-10 30 views
5

Tôi có thể sử dụng ApprovalTests với PDF không? Tôi đã thử sử dụng FileLauncher nhưng có vẻ như các tệp PDF giống hệt nhau hơi khác ở mức tệp (bit). Hay tôi đã sử dụng sai?Phê duyệt và PDF

[TestMethod] 
[UseReporter(typeof(FileLauncherReporter))] 
public void TestPdf() 
{ 
    var createSomePdf = PdfCreate(); 

    ApprovalTests.Approvals.Verify(new FileInfo(createSomePdf.FileName)); 

} 

Trả lời

6

Pdf có nhiều khả năng được tạo bằng dấu thời gian nhất. Tùy thuộc vào phương pháp được sử dụng để tạo pdf, bạn có thể giả lập thời gian đã tạo. nhưng tôi phải chà nó.

Đây là mã tôi đã sử dụng để làm điều đó.

public static void VerifyPdf(string coverFile) 
    { 
     ScrubPdf(coverFile); 
     Approvals.Verify(new ExistingFileWriter(coverFile)); 
    } 

    private static void ScrubPdf(string coverFile) 
    { 
     long location; 
     using (var pdf = File.OpenRead(coverFile)) 
     { 
      location = Find("/CreationDate (", pdf); 

     } 
     using (var pdf = File.OpenWrite(coverFile)) 
     { 
      pdf.Seek(location, SeekOrigin.Begin); 

      var original = "/CreationDate (D:20110426104115-07'00')"; 
      var desired = new System.Text.ASCIIEncoding().GetBytes(original); 

      pdf.Write(desired, 0, desired.Length); 
      pdf.Flush(); 
     } 
    } 
+0

Brilliant, nhờ Llewellyn, cũng đã có một ngày và Id tài liệu sửa đổi được tạo ra bởi tôi pdf-máy phát điện (iTextSharp), phải thêm chúng quá. – joeriks

5

Tôi đã tìm thấy công cụ dòng lệnh, diff-pdf. So sánh 2 tệp PDF và trả về mã thoát 0 nếu chúng giống nhau, 1 nếu chúng khác nhau. Tải xuống + trích xuất + thêm nó vào PATH của bạn.

Nhược điểm - nó phải hiển thị cả hai tệp PDF để thực hiện sự khác biệt. Nếu chúng lớn, thì bạn sẽ đạt được thành công.

Người phê duyệt (dựa rất nhiều vào ApprovalTests.Approvers.FileApprover):

public class DiffPdfApprover : IApprovalApprover 
{ 
    public static void Verify(byte[] bytes) 
    { 
     var writer = new ApprovalTests.Writers.BinaryWriter(bytes, "pdf"); 
     var namer = ApprovalTests.Approvals.GetDefaultNamer(); 
     var reporter = ApprovalTests.Approvals.GetReporter(); 

     ApprovalTests.Core.Approvals.Verify(new DiffPdfApprover(writer, namer), reporter); 
    } 

    private DiffPdfApprover(IApprovalWriter writer, IApprovalNamer namer) 
    { 
     this.writer = writer; 
     this.namer = namer; 
    } 

    private readonly IApprovalNamer namer; 
    private readonly IApprovalWriter writer; 
    private string approved; 
    private ApprovalException failure; 
    private string received; 

    public virtual bool Approve() 
    { 
     string basename = string.Format(@"{0}\{1}", namer.SourcePath, namer.Name); 
     approved = Path.GetFullPath(writer.GetApprovalFilename(basename)); 
     received = Path.GetFullPath(writer.GetReceivedFilename(basename)); 
     received = writer.WriteReceivedFile(received); 

     failure = Approve(approved, received); 
     return failure == null; 
    } 

    public static ApprovalException Approve(string approved, string received) 
    { 
     if (!File.Exists(approved)) 
     { 
      return new ApprovalMissingException(received, approved); 
     } 

     var process = new Process(); 
     //settings up parameters for the install process 
     process.StartInfo.FileName = "diff-pdf"; 
     process.StartInfo.Arguments = String.Format("\"{0}\" \"{1}\"", received, approved); 

     process.Start(); 

     process.WaitForExit(); 

     if (process.ExitCode != 0) 
     { 
      return new ApprovalMismatchException(received, approved); 
     } 

     return null; 
    } 

    public void Fail() 
    { 
     throw failure; 
    } 

    public void ReportFailure(IApprovalFailureReporter reporter) 
    { 
     reporter.Report(approved, received); 
    } 

    public void CleanUpAfterSucess(IApprovalFailureReporter reporter) 
    { 
     File.Delete(received); 
     if (reporter is IApprovalReporterWithCleanUp) 
     { 
      ((IApprovalReporterWithCleanUp)reporter).CleanUp(approved, received); 
     } 
    } 
} 

Để Verify:

DiffPdfApprover.Verify(pdfBytes);

diff-pdf có thể trực quan cho thấy diffs là tốt. Tôi đã cuộn một phóng viên cho điều này, nhưng không sử dụng nó nhiều. Tôi nghĩ rằng nó sẽ có ích nếu có hồi quy sau khi dev báo cáo ban đầu (đó là nơi tôi đang ở ngay bây giờ).

public class DiffPdfReporter : GenericDiffReporter 
{ 
    private static readonly string Path = FindFullPath("diff-pdf.exe"); 
    public DiffPdfReporter() : base(Path, 
     GetArgs(), 
     "Please put diff-pdf.exe in your %PATH%. https://github.com/vslavik/diff-pdf. And restart whatever's running the tests. Everything seems to cache the %PATH%.") { } 

    private static string GetArgs() 
    { 
     return "--view \"{0}\" \"{1}\""; 
    } 

    private static string FindFullPath(string programInPath) 
    { 
     foreach (var path in from path in Environment.GetEnvironmentVariable("path").Split(';') 
          select path) 
     { 
      var fullPath = System.IO.Path.Combine(path, programInPath); 
      if (File.Exists(fullPath)) 
       return fullPath; 
     } 
     return null; 
    } 
} 
1

Có vẻ như điều này được tích hợp vào Phê duyệt kiểm tra ngay bây giờ.

sử dụng:

Approvals.VerifyPdfFile(pdfFileLocation); 

Xem the source:

public static void VerifyPdfFile(string pdfFilePath) 
{ 
    PdfScrubber.ScrubPdf(pdfFilePath); 
    Verify(new ExistingFileWriter(pdfFilePath)); 
} 
+0

Tôi mới sử dụng ApprovalTests và từ những gì tôi thấy tài liệu khá thưa thớt (đặc biệt là đối với PDF). Bạn có thể giải thích làm thế nào bạn sẽ viết một bài kiểm tra đơn vị xác minh một PDF? Ví dụ về github làm cho nó trông giống như một filename.recieved.pdf nên đã được tạo ra, nhưng tôi không thể tìm thấy một. – Ben

+1

@Ben có xem xét [ví dụ kiểm tra đơn vị] (https://github.com/approvals/ApprovalTests.Net/blob/master/ApprovalTests.Tests/Pdf/PdfTest.cs) trong dự án. Nhưng bạn nói đúng, có vẻ như không tạo ra tệp .received cho tệp PDF. Tôi tự tạo ra nó trong các bài kiểm tra của mình. – Mathew

+0

cảm ơn @Mathew. Nó ít nhất là chạy so sánh bây giờ, nhưng nó vẫn thất bại. Nếu tôi so sánh hai tài liệu, bản thân ngày tạo của tôi là khác nhau (tôi đoán nó được quan tâm bởi phương pháp PdfScrubber.ScrubPdf (...)) và cũng có một vài Hướng dẫn ở dưới cùng của tệp khác – Ben

Các vấn đề liên quan