# 11.3.2 测试 POST 请求

WebTestClient 可以做的不仅仅是针对 Controller 的 GET 请求进行测试。它还可以用于测试任何类型的 HTTP 方法，包括 GET、POST、PUT、PATCH、DELETE 和 HEAD 请求。表 11.1 将 HTTP 方法映射到 WebTestClient 方法。

**表 11.1 WebTestClient 针对 Spring WebFlux 控制器测试任何类型的请求**

| HTTP 方法 | WebTestClient 方法 |
| ------- | ---------------- |
| GET     | .get()           |
| POST    | .post()          |
| PUT     | .put()           |
| PATCH   | .patch()         |
| DELETE  | .delete()        |
| HEAD    | .head()          |

作为针对 Spring WebFlux Controller 中的另一个 HTTP 方法请求示例的测试，让我们看看针对DesignTacoController 的另一个测试。这次，将通过向 `/design` 提交 POST 请求来编写针对创建 taco 端点 API 的测试：

```java
@Test
public void shouldSaveATaco() {
    TacoRepository tacoRepo = Mockito.mock(TacoRepository.class);
    Mono<Taco> unsavedTacoMono = Mono.just(testTaco(null));
    Taco savedTaco = testTaco(null);
    savedTaco.setId(1L);
    Mono<Taco> savedTacoMono = Mono.just(savedTaco);
    when(tacoRepo.save(any())).thenReturn(savedTacoMono);
    WebTestClient testClient = WebTestClient.bindToController(
        new DesignTacoController(tacoRepo)).build();
    
    testClient.post()
        .uri("/design")
        .contentType(MediaType.APPLICATION_JSON)
        .body(unsavedTacoMono, Taco.class)
        .exchange()
        .expectStatus().isCreated()
        .expectBody(Taco.class)
        .isEqualTo(savedTaco);
}
```

与前面的测试方法一样，shouldSaveATaco() 首先设置一些测试数据，模拟 TacoRepository，然后构建一个 WebTestClient，并绑定到 Controller。然后，使用 WebTestClient 向 `/design` 提交 POST 请求，请求的 body 类型为 application/json，有效负载是未保存 Mono 中 Taco 的 json 序列化形式。在执行 exchange() 之后，测试断言响应具有 HTTP 201(CREATED) 状态，并且正文中的有效负载等于保存的 Taco 对象。
