2012-10-10 10 views
5

Czy mogę używać zatwierdzających testów z plikami PDF? Próbowałem użyć FileLauncher, ale wydaje się, że identyczne pliki PDF są nieco inne na poziomie pliku (bit). A może użyłem tego nieprawidłowo?Zatwierdzenia i PDF

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

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

} 

Odpowiedz

6

Pdf jest najprawdopodobniej tworzone z sygnaturą czasową. W zależności od metody użytej do utworzenia pliku pdf, możesz być w stanie wyłudzić stworzony czas. ale musiałem to wyczyścić.

Oto kod, który robiłem.

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 dzięki Llewellyn, nie było również data i dokument zmodyfikowany id stworzony przez mojego pdf-generator (iTextSharp), musiał je dodać także. – joeriks

5

znalazłem narzędzie wiersza polecenia, diff-pdf. Porównuje 2 pliki PDF i zwraca kod wyjścia 0, jeśli są one takie same, 1 jeśli są różne. Pobierz + wyciąg + dodaj do swojej PATH.

Minusy - musi renderować oba pliki PDF, aby wykonać różnicę. Jeśli są duże, perf hit.

zatwierdzający (opiera się głównie na 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); 
     } 
    } 
} 

sprawdzenie:

DiffPdfApprover.Verify(pdfBytes);

Diff-PDF może wizualnie przedstawiają dyferencjału również. Przekartkowałem Reportera, ale nie używam go zbyt wiele. Sądzę, że przyda się, jeśli po wstępnym raporcie z raportami są regresje (na którym teraz jestem).

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

Wygląda na to, że jest teraz wbudowany w funkcję ApprovalTests.

Wykorzystanie:

Approvals.VerifyPdfFile(pdfFileLocation); 

Zobacz the source:

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

Jestem nowy w ApprovalTests iz tego, co widziałem, dokumentacja jest dość rzadka (szczególnie w przypadku plików PDF). Czy mógłbyś wyjaśnić, jak napisałbyś test jednostkowy, który weryfikuje plik PDF? Przykład na githubie sprawia, że ​​powinien wyglądać plik filename.recieved.pdf, ale nie mogę go znaleźć. – Ben

+1

@Ben zajrzyj do [przykład testowy urządzenia] (https://github.com/approvals/ApprovalTests.Net/blob/master/ApprovalTests.Tests/Pdf/PdfTest.cs) w projekcie. Ale masz rację, nie wydaje się, aby plik .received dla plików PDF. Sam tworzę to w moich testach. – Mathew

+0

dzięki @Mathew. To przynajmniej teraz prowadzi porównanie, ale nadal nie działa. Jeśli porównuję dwa dokumenty, to moja data utworzenia jest inna (domyślam się, że jest to obsługiwane przez metodę PdfScrubber.ScrubPdf (...)), a w dolnej części pliku znajduje się również kilka Guids, które różnią się – Ben

Powiązane problemy