Спок проверка вызова с использованием переменной вместо литерала - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть тест Спока, подобный следующему:

class SomeSpec extends Specification {

    Map message

    String topicArn = "aws::fake-sns-topic"

    def 'test new message'() {
        when: 'A new message is received'
        message = [
                "ownerToken": null,
                "status": "NEW"
        ]
        def response = api.doHandleRequest(message)

        then: 'It is handled'
        1 * snsClient.publish(topicArn, JsonOutput.toJson([
                "ownerToken": null,
                "status": "NEW"
        ]))
    }
}

Это отлично работает, но я бы предпочел изменить утверждение на

1 * snsClient.publish(topicArn, message)

, чтобы уменьшить дублирование литерала карты. Когда я получаю следующую ошибку:

Too few invocations for:

1 * snsClient.publish(topicArn, JsonOutput.toJson(message))   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * snsClient.publish('aws::fake-sns-topic', '{"ownerToken":null","status":"NEW"}')
One or more arguments(s) didn't match:
0: <matches>
1: argument == expected
   |        |  |
   |        |  null
   |        false
   {"ownerToken":null,"status":"NEW"}

Почему второй аргумент становится пустым, когда я использую переменную сообщения вместо литерала карты? Первый аргумент является переменной, а не литералом, и он проходит через штраф.

1 Ответ

2 голосов
/ 03 апреля 2020

Я бы предпочел изменить утверждение на

1 * snsClient.publish(topicArn, message)

Ну, это не может так работать. Как показывает ваша опубликованная ошибка теста, вы действительно хотите

1 * snsClient.publish(topicArn, JsonOutput.toJson(message))

, что приводит к исключению, которое вы видите во время теста.

Причина в том, что взаимодействие, которое вы тестируете в * Блок 1011 * должен быть подготовлен к проверке до того, как код в блоке when: будет выполнен. Но до этого блока message равен null. Поэтому вы хотите присвоить значение в блоке setup: или given: (оба являются просто псевдонимами друг для друга):

def 'new message gets published'() {
  given: 'a new message'
  message = [
    "ownerToken": null,
    "status"    : "NEW"
  ]

  when: 'the message is received'
  def response = api.doHandleRequest(message)

  then: 'it gets published'
  1 * snsClient.publish(topicArn, JsonOutput.toJson(message))
}

Теперь ваш тест пройден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...