Установить защиту WebTestClient CSRF в тесте BDD - PullRequest
0 голосов
/ 24 марта 2019

Мой модульный тест BDD (Cucumber) с использованием WebTestClient не выполняется (при 403 Запрещено). После некоторой отладки я установил, что это происходит из-за сбоя проверки CSRF. Но мои тестовые шаги , похоже, устанавливают токен CSRF. Так что же не так? Как установить токен CSRF для теста WebTestClient?


Мой тестовый сценарий:

  Scenario Outline: Login
    Given that player "<player>" exists with  password "<password>"
    And presenting a valid CSRF token
    When log in as "<player>" using password "<password>"
    Then program accepts the login

Код моих шагов теста (обратите внимание на наличие client.mutateWith(csrf())):


@SpringBootTest(...)
@AutoConfigureWebTestClient
public class WebSteps {

   @Autowired
   private WebTestClient client;

...

   private WebTestClient.ResponseSpec response;

   @Given("presenting a valid CSRF token")
   public void presenting_a_valid_CSRF_token() {
      client.mutateWith(csrf());
   }

   @When("log in as {string} using password {string}")
   public void log_in_as_using_password(final String player,
            final String password) {
      response = client.post().uri("/login")
               .contentType(MediaType.APPLICATION_FORM_URLENCODED)
               .body(BodyInserters.fromFormData("username", player)
                        .with("password", password))
               .exchange();
   }

   @Then("program accepts the login")
   public void program_accepts_the_login() {
      response.expectStatus().isFound().expectHeader().valueEquals("Location",
               "/");
   }

...

1 Ответ

0 голосов
/ 24 марта 2019

Несмотря на свое название, метод mutateWith() на самом деле не изменяет свой объект. Скорее, он возвращает новый объект, к которому применена мутация. Поэтому вместо написания

   @Given("presenting a valid CSRF token")
   public void presenting_a_valid_CSRF_token() {
      client.mutateWith(csrf());
   }

запись

   @Given("presenting a valid CSRF token")
   public void presenting_a_valid_CSRF_token() {
      client = client.mutateWith(csrf());
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...