2016-12-13 44 views
1

我正在嘗試圍繞scalatestit關鍵字構建一個包裝。但是,這種解決方案似乎沒有按照預期工作。此外,它甚至不編譯:如何構建一個圍繞scalatest的「it」關鍵字的包裝?

trait MyFunSpec extends FunSpec { 

    private val _it: FunSpec.this.ItWord = it 

    protected def it(specText: String, testTags: org.scalatest.Tag*) 
    // ...do something extra here... 
    (testFun: => Any /* Assertion */)(implicit pos: Position): Unit = { 
    _it(specText, testTags: _*)(testFun)(pos) 
    // ...do something extra here... 
    } 
} 

我編譯此代碼後得到的錯誤信息如下:

[error] MyFunSpec.scala: ambiguous reference to overloaded definition, 
[error] both method it in trait MyFunSpec of type (specText: String, testTags: 
    org.scalatest.Tag*)(testFun: => Any)(implicit pos: 
    org.scalactic.source.Position)Unit 
[error] and value it in trait FunSpecLike of type => FunSpecSpec.this.ItWord 
[error] match argument types (String) 

請注意,主要的想法是該方法的名稱保持it,所以重命名它類似於alternativeIt這不是一個令人滿意的解決方案。

任何建議,我在這裏做錯了什麼?任何解決方案將不勝感激!謝謝!

+0

當您嘗試別名它_IT,編譯器會很困惑,因爲有在FunSpecLike,如果它的定義和另一個在MyTrait(因此過載)。其次,爲了真正覆蓋它,你應該實際覆蓋val it = new ItWord {...}。在那裏匿名類超級參考FunSpec中舊的ItWord實現。 – HTNW

回答

1

試試這個:

trait MyFunSpec extends FunSpec { 
    override protected val it = new ItWord { 
    override def apply(specText: String,testTags: org.scalatest.Tag*)(testFun: => Any)(implicit pos: org.scalactic.source.Position): Unit = { 
     println("Before") 
     super.apply(specText, testTags:_*)(testFun)(pos) 
     println("After") 
    } 
    } 
} 
+1

用幾句話來解釋你的解決方案會很好。 OP還詢問他們自己的代碼有什麼問題。 – Borodin