2011-11-22 46 views
2

我正在嘗試使用Specs2編寫下列規範,但似乎無法讓它工作,編譯器總是抱怨「沒有隱式視圖可用單位=> org.specs2.execute.Result「。試圖用閉包編寫測試最終失敗Specs2

這裏的測試來源:

"generate the correct output when merging an extraction" in { 
     val source = new File("src/test/resources/sample-docs/text-and-image-on-page-2.pdf") 
     val output = this.extractor.extract(source) 
     val pdfGenerator = new ITextPdfGenerator() 
     val processor = new ExecutableProcessor() 

     val ocrInput = IOUtils.createTempFile("ocr_input", "pdf") 
     val ocrOutput = IOUtils.createTempFile("ocr_output", "pdf") 

     deleteWhenDone[MatchResult[Any]](output.getFullTextFile, ocrInput, ocrOutput) ({ 

      pdfGenerator.generatePdf(source, ocrInput, output.getPagesWithImages) 
      processor.process(ocrInput, ocrOutput) 

      this.extractor.mergeExtraction(output, ocrOutput) 

      IOUtils.readFile(output.getFullTextFile) === """sample text on line 1 page 1 sample text on line 2 page 1 sample text on line 1 page 3 sample text on line 2 page 3 """ 

     }) 

    } 

和刪除完成後的功能如下:

def deleteWhenDone[T](files : File*) (fn : => T) { 
    try { 
     fn 
    } finally { 
     IOUtils.deleteFiles(files) 
    } 
} 

如果此行是在規範的結束,它的工作:

IOUtils.readFile(output.getFullTextFile) === "sample text on line 1 page 1 sample text on line 2 page 1 sample text on line 1 page 3 sample text on line 2 page 3 " 

爲什麼它會這樣失敗,我該怎麼辦才能繼續使用閉包並使測試合併è?

編輯

改變了deleteWhenDone調用此:

deleteWhenDone[Result](output.getFullTextFile, ocrInput, ocrOutput) ({ 

    pdfGenerator.generatePdf(source, ocrInput, output.getPagesWithImages) 
    processor.process(ocrInput, ocrOutput) 

    this.extractor.mergeExtraction(output, ocrOutput) 

    IOUtils.readFile(output.getFullTextFile) === "sample text on line 1 page 1 sample text on line 2 page 1 sample text on line 1 page 3 sample text on line 2 page 3 " 

}) 

但仍然無法正常工作。

EDIT 2

由於拉斐爾的答案,這使得它的工作最終的代碼爲:

def deleteWhenDone[T](files : File*) (fn : => T) : T = { 
    try { 
     fn 
    } finally { 
     IOUtils.deleteFiles(files) 
    } 
} 

我錯過了方法的返回類型。謝謝!

回答

3

deleteWhenDone功能有單位對其結果類型,這是不符合expcted類型in參數兼容。你可以改變它通過添加一個等號的定義返回T

def deleteWhenDone[T](files : File*) (fn : => T) = { 
    try { 
     fn 
    } finally { 
     IOUtils.deleteFiles(files) 
    } 
} 
+0

謝謝,就是這樣! –

3

的在方法被定義如下:

def in[T <% Result](r: => T): Example 

所以,預計作爲參數代碼塊,其返回類型是從結果中導出,或者可以是隱式轉換爲結果。如果您在測試結束時編寫Success(),它會編譯。

你也可以做這樣的事情:

implicit def anyToSuccess[T](a: T): org.specs2.execute.Result = success 
+0

基督教嗨,我已經改變了呼叫簽名** deleteWhenDone [結果] **(看我的更新答案),但仍犯規工作。而我無法調用Success(),規範結果是文件文本和被比較文本之間的===。 –