Как включить внешние исходные файлы в спецификацию, чтобы указать меры?
Я использую Specs2, чтобы написать спецификацию для библиотеки измерений. Для проверки рассчитанных показателей у меня есть множество исходных файлов, охватывающих как стандартные случаи, так и множество угловых случаев. Я проанализировал их вручную, чтобы знать точные измерения, но чтобы документировать все и автоматизировать это, это должно быть частью спецификации Specs2.
До сих пор я копировал некоторые исходные файлы в свою спецификацию и передавал их проверяющим методам в виде строки. Однако у этого есть и недостаток: встроенный код больше не проверяется - внешние файлы проверяются стандартным компилятором, поэтому я уверен, что это правильный код. Нет проблем просто передать имя файла, но моя спецификация должна включать исходный код в итоговый отчет HTML, а не только указывать на файл, который нужно выкопать и посмотреть вручную. Чтобы дать вам некоторое представление, вот код, который я сейчас использую
class CountVisitorSpec extends Specification { def is =
"Given the ${com/example/Test1.java} source, the visitor should deliver a count of ${16}" ! new GivenThen {
def extract(text: String) = {
val (filename, count) = extract2(text)
val file = classOf[CountVisitorSpec].getClassLoader.getResource(filename).getFile
val src = Path(file).slurpString
val visitor = new CountVisitor
AstAnalyzer.runWith(src, visitor)
visitor.count must_== count.toLong
}
}
}
У кого-то есть идея, как можно указать внешние файлы, чтобы они были включены в качестве исходного ввода в итоговый отчет HTML?
1 ответ
Это должно быть просто вопросом инкапсуляции того, что вы хотите:
def withFile(name: String, description: String)(ex: String => Result) = {
("Given the ${"+file+"},"+description) ^ new GivenThen {
def extract(text: String) = ex(text)
} ^
linkToSource(file)^ // if you want to create a Markdown link to the source file
includeSource(file) // if you want to include the source code
}
def linkToSource(fileName: String) = "[source]("+fileName+")"
def includeSource(fileName: String) = "<code class=\"prettyprint\">"+Path(file).slurpString+"</code>"
А потом:
class CountVisitorSpec extends Specification { def is =
withFile("com/example/Test1.java", "the visitor should deliver a count of ${16}",
(text: String) => {
val (filename, count) = extract2(text)
val file = classOf[CountVisitorSpec].getClassLoader.getResource(filename).getFile
val src = Path(file).slurpString
val visitor = new CountVisitor
AstAnalyzer.runWith(src, visitor)
visitor.count must_== count.toLong
}
}
}