我得到了一個由供應商創建的代碼,看起來他們的工程師在單元測驗中做了很多硬編碼。我有一個函式的單元測驗,該函式將作為代碼的一部分生成的報告的完整絕對路徑輸出為字串。目前失敗的單元測驗/斷言看起來像
val reportPath = obj.getReportPath()
assert(reportPath.equals("file:/Users/khalid.mahmood/ReportingModule/target/report.csv")
其中 ReportingModule 是專案的名稱。
代碼邏輯很好,因為對我來說,reportPath 變數的值是:
file:/Users/vikas.saxena/coding_dir/ReportingModule/target/report.csv
由于我將專案克隆到coding_dir我的主目錄中呼叫的子目錄中,因此邏輯對我來說看起來不錯。
我想修改斷言以確保代碼自己繪制專案的基本目錄,并且在谷歌搜索中我發現 sbt與此鏈接中base的等效project.baseDir (from maven)
但是,以下代碼更改對我來說并沒有奏效
assert(reportPath.equals(s"""$base""" "/target/report.csv")
我能得到一些關于如何正確處理的指示嗎?
uj5u.com熱心網友回復:
如果您使用的是 ScalaTest,則可以ConfigMap執行此操作。
首先,您需要告訴 ScalaTest Runner 將路徑添加到ConfigMap. 這可以在您的.sbt檔案中完成,如下所示:
Test / testOptions = Tests.Argument(
TestFrameworks.ScalaTest, s"-DmyParameter=${baseDirectory.value}")
(請注意,它不一定是baseDirectory.value,許多其他 sbt 設定都可以使用。我會target.value針對您的特定用例提出建議)。
在測驗本身中,您需要從ConfigMap. 最簡單的方法是使用 Fixture Suite(例如FixtureAnyFunSuite)并混合ConfigMapFixturetrait:
import org.scalatest.funsuite.FixtureAnyFunSuite
import org.scalatest.fixture.ConfigMapFixture
class ExampleTest extends FixtureAnyFunSuite with ConfigMapFixture {
test("example") { configMap =>
val myParameter = configMap.getRequired[String]("myParameter")
// actual test logic goes here
succeed
}
}
當然還有其他方法可以解決這個問題。例如,您還可以簡單地獲取當前作業目錄 ( cwd) 并從那里開始作業。然而,這樣做的缺點是在多模塊構建中,cwd根據Test / forksbt 中的設定是 true 還是 false會有所不同。因此,為了使您的代碼能夠抵御這些型別的可能性,我建議堅持使用這種ConfigMap方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384763.html
