2012-10-10 9 views
5

ApprovalTestsをPDFで使用できますか?私はFileLauncherを使用してみましたが、同じPDFがファイル(ビット)レベルでわずかに異なっているようです。それとも私はそれを間違って使ったのですか?承認テストとPDF

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

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

} 

答えて

6

Pdfは、おそらくタイムスタンプで作成されています。 pdfを作成する方法に応じて、作成した時間を模擬することができます。私はそれをこすっていた。

これは私が以前に行ったコードです。

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

ブリリアント、感謝ルウェリンは、もあった私のpdf-ジェネレータ(itextsharp)、によって作成された更新日時と文書IDは、それらを追加する必要がありましたあまりにも。 – joeriks

5

コマンドラインツールdiff-pdfが見つかりました。 2つのPDFを比較し、同じ場合は終了コード0を返し、異なる場合は終了コード0を返します。 + extract +をPATHに追加してください。

欠点 - 差分を実行するには両方のPDFをレンダリングする必要があります。彼らが大きいならば、パーフェクトヒット。 (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); 
     } 
    } 
} 

確認するには:

DiffPdfApprover.Verify(pdfBytes);

差分-PDFは、視覚的にも差分を表示することができます。私はこのためにReporterを転がしましたが、それをあまり使わないでください。私は最初のレポート開発者の後に回帰があるなら、それが便利になるだろうと思う(私が今どこにいるか)。

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

これは今やApprovalTestsに組み込まれているようです。

用法:

Approvals.VerifyPdfFile(pdfFileLocation); 

を参照してください。the source

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

私はApprovalTestsの新機能で、ドキュメントはかなり疎であることを見てきました(特にPDFの場合)。あなたはPDFを検証する単体テストを書く方法を説明できますか? githubの例では、filename.recieved.pdfが作成されているはずですが、見つけられませんでした。 – Ben

+1

@Benはプロジェクトの[ユニットテストの例](https://github.com/approvals/ApprovalTests.Net/blob/master/ApprovalTests.Tests/Pdf/PdfTest.cs)を見てください。しかし、あなたが正しいです、それはPDFの受信ファイルを作成していないようです。私は自分のテストで自分自身を作成し​​ます。 – Mathew

+0

@Mathewに感謝します。少なくとも今比較を実行していますが、それでも失敗します。 2つのドキュメントを比較すると、自分の作成日が異なります(PdfScrubber.ScrubPdf(...)メソッドで処理されていると思います)。また、ファイルの末尾付近にいくつかのGuidがあります – Ben