【问题标题】:sbt how to access base directory of project in scala codesbt如何在scala代码中访问项目的基本目录
【发布时间】:2022-01-18 14:53:30
【问题描述】:

我收到了一个由供应商创建的代码,看起来他们的工程师在单元测试中做了很多硬编码。 我有一个函数的单元测试,它将作为代码的一部分生成的报告的完整绝对路径作为字符串输出。 目前失败的单元测试/断言看起来像

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) 来自这个 link

但是以下代码更改对我来说没有效果

assert(reportPath.equals(s"""$base""" + "/target/report.csv")

我能否得到一些关于如何做到这一点的指导。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    如果您使用的是 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)并混合 ConfigMapFixture 特征:

    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 将根据 sbt 中的 Test / fork 设置是真还是假而有所不同。因此,为了使您的代码能够抵御这些可能性,我建议坚持使用ConfigMap 方式。

    【讨论】:

    • 这是否意味着我的单元测试看起来像assert(reportPath.equals(myParameter + "/target/report.csv")
    • 我无法理解为什么有人会问这个问题。在您编写此评论所花费的相同时间内,您可以将代码输入编辑器并亲自查看它是否有效。我通常会称你为懒惰,但这种行为甚至不能用懒惰来解释,因为简单地尝试它实际上是 less 工作。那么,浪费人们的时间有什么意义呢?您必须表现出比这更多的主动性,否则您作为开发人员的职业生涯将会很短暂。
    • 抱歉,看到你的回复我就冲动了,我只是出于好奇才发的。如您所见,我接受了关于尝试几个小时的问题的答案,它对我有用。我明白你的意思,我真的很抱歉这个评论,因为我应该在尝试后删除它。
    • 是的,不用担心。
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2019-06-28
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2016-09-01
    • 2011-10-22
    • 2015-05-12
    相关资源
    最近更新 更多