Попытка написать тест с замыканием в конце не дает результатов на Specs2 - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь написать следующую спецификацию, используя Specs2, но не могу заставить ее работать, компилятор всегда жалуется на то, что «неявное представление не доступно из Unit => org.specs2.execute.Result».

Вот источник теста:

    "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 "

})

Но все равно не работает.

РЕДАКТИРОВАТЬ 2

Благодаря ответу Рафаэляокончательный код, который заставил его работать, был:

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

Я пропустил тип возврата метода.Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Функция deleteWhenDone имеет Unit для своего типа результата, который не совместим с ожидаемым типом параметра in. Вы можете изменить его так, чтобы он возвращал T, добавив знак равенства в определение:

def deleteWhenDone[T]( files : File* ) ( fn : => T ) = {
    try {
        fn
    } finally {
        IOUtils.deleteFiles( files )
    }
}
3 голосов
/ 22 ноября 2011

Метод in определяется следующим образом:

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

Таким образом, он ожидает в качестве параметра блок кода, тип возвращаемого значения которого получен из Result или может быть неявно преобразован в Result. Если вы напишите Success () в конце теста, он скомпилируется.

Вы также можете сделать что-то подобное:

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