Как включить внешние исходные файлы в спецификацию, чтобы указать меры? - PullRequest
1 голос
/ 17 июня 2011

Я использую 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 Ответ

2 голосов
/ 20 июня 2011

Это просто вопрос инкапсуляции того, что вы хотите:

 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
              }
      }
   }
...