代码之家  ›  专栏  ›  技术社区  ›  Raymond Chenon

检查字符串是否与此字符串插值匹配

  •  0
  • Raymond Chenon  · 技术社区  · 6 年前

    我想比较字符串内容和字符串插值。这个 string interpolation 例如

    s"Hello ${name} ,
    Your order ${UUID} will be shipped on ${date}."
    

    有一些约束可以用正则表达式表示。

    这个 date 格式为2018-03-19T16:14:46.191+01:00(+%Y-%m-%dT%H:%m:%S)。

    这个 UUID 是随机的,并遵循此格式834aa5fd-af26-416d-b715-adca01a866c4。

    一种可能的解决方案是检查字符串结果是否包含字符串插值的某些固定部分。

    问题

    限制 :您事先不知道字符串插值中的参数值。

    如何检查字符串插值的值?

    通常,如果您事先不知道参数值,如何使用字符串插值测试字符串比较?

    可以用Java提供解决方案。Scala是首选。

    1 回复  |  直到 6 年前
        1
  •  2
  •   James Whiteley    6 年前

    您可以在测试中定义变量。例如,使用以下功能:

    def stringToTest(name: String, UUID: String, date: String): String = {
      s"Hello ${name}, Your order ${UUID} will be shipped on ${date}."
    }
    

    您可以编写这样的测试(假设您使用的是 FlatSpec with Matchers 在您的测试中):

    "my function" should {
      "return the correct string" in {
        val name = "Name"
        val UUID = "834aa5fd-af26-416d-b715-adca01a866c4"
        val date = "2018-03-19T16:14:46.191+01:00"
    
        stringToTest(name, UUID, date) shouldBe "Hello Name, Your order 834aa5fd-af26-416d-b715-adca01a866c4 will be shipped on 2018-03-19T16:14:46.191+01:00."
      }
    }
    

    您应该能够独立地测试每个函数,并且能够使用传递到函数中的伪值而不会出现问题。如果您使用的是真正的随机值(或者想要使测试过于复杂),我想您可以使用regex检查。我找到的最简单的方法是:

    "this string" should {
      "match the correct regex" in {
        val regex = "^Hello .*, " +
          "Your order .{8}-.{4}-.{4}-.{4}-.{12} will be shipped on " +
          "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}\+\d{2}:\d{2}\.$" // whatever
    
        val thingToCheck = "Hello Name, " +
          "Your order 834aa5fd-af26-416d-b715-adca01a866c4 will be shipped on " +
          "2018-03-19T16:14:46.191+01:00."
    
        thingToCheck.matches(regex) shouldBe true
      }
    }