2016-04-29 28 views
0

我是Scala,Scalacheck和specs2的新手,如果問題很明顯的話,我會很滿意。我試圖尋找一個這樣的例子,但沒有找到任何相關的東西。高階Scalacheck屬性

基本上我正在尋找一種方法來創建一個測試類,使用specs2來定義一個Prop.forAll屬性,該屬性接收另一個scalacheck屬性(如果這是可能的話,不需要),一個生成器(Gen [A])和一個文件路徑並檢查該屬性是否通過確定的一組樣本(來自發生器)並將錯誤保存在文件中。

無論如何要實現這一點?說到在一個通用的方式

+0

如何是你的財產的接收和其他財產+發電機+文件路徑的「託」?特別是當你進入Prop.forAll((p:Prop,g:Gen [A],f:File)=> ...)時,你必須有一個任意的p,g和f。 – Eric

+0

Gen [A]從RDDGen類讀取一個RDD並返回包裝爲Gen [A]的行,該路徑將在測試類中給出。主要目標是:給P一個屬性檢查它是否失敗了,並保存在文件中。 – mtelloz

回答

0

我提出這樣的:

import org.specs2._ 
import org.specs2.execute._ 
import org.scalacheck._ 

class TestSpec extends Specification with ScalaCheck { def is = s2""" 

    Test my RDD $test 

    """ 

    def test = { 
    // get/create a generator 
    val gen: Gen[Row] = ??? 
    // run the property 
    property(gen, "prop1.txt") { r: Row => 
     r.values must haveSize(3) 
    } 
    } 

    def property[A, R : AsResult](g: Gen[A], path: String)(prop: A => R): Result = 
    saveResult(path)(Prop.forAll(g)(prop)) 

    def saveResult[R : AsResult](path: String)(r: R): Result = { 
    val result = AsResult(r) 
    if (!result.isSuccess) writeToFile(result, path) 
    result 
    } 

    def writeToFile(result: Result, path: String) = ??? 

    case class Row(values: List[Int]) 
} 
+0

你好!嘗試在調用saveResult時將屬性函數應用到屬性函數中,您可以解釋下面這段代碼:'saveResult(path)(Prop.forAll(g)(prop))'如何將2個參數傳遞到forAll道具的圓括號中。我得到一個單位不採取任何參數錯誤:(但總體而言你的例子看起來很有前途,謝謝你! – mtelloz

+0

對不起,我編輯了代碼,現在編譯。 – Eric

+0

它的工作!謝謝!我想問你一些東西否則,如果你讓我,在我的情況下定義gen時,我從一個從avro文件創建的RDD中包裝一行,但是因爲我在試圖定義測試函數中的複雜屬性時使用泛型實現它,所以我無法做到所以既然它只是返回一個Row,我應該像創建一個case類一樣創建一個case類,並根據avro中的模式定義參數並將它投射出去?順便謝謝你花時間回覆我的問題!最好的問候。 – mtelloz