[−][src]Trait wiremock::Match
Anything that implements Match
can be used to constrain when a Mock
is activated.
Match
is the only trait in the whole wiremock
crate and can be used to extend
the set of matchers provided out-of-the-box to cater to your specific testing needs:
use wiremock::{Match, MockServer, Mock, Request, ResponseTemplate}; use wiremock::matchers::HeaderExactMatcher; use std::convert::TryInto; // Check that a header with the specified name exists and its value has an odd length. pub struct OddHeaderMatcher(http_types::headers::HeaderName); impl Match for OddHeaderMatcher { fn matches(&self, request: &Request) -> bool { match request.headers.get(&self.0) { // We are ignoring multi-valued headers for simplicity Some(values) => values[0].as_str().len() % 2 == 1, None => false } } } #[async_std::main] async fn main() { // Arrange let mock_server = MockServer::start().await; Mock::given(OddHeaderMatcher("custom".try_into().unwrap())) .respond_with(ResponseTemplate::new(200)) .mount(&mock_server) .await; // Even length let status = surf::get(&mock_server.uri()) .set_header("custom", "even") .await .unwrap() .status(); assert_eq!(status.as_u16(), 404); // Odd length let status = surf::get(&mock_server.uri()) .set_header("custom", "odd") .await .unwrap() .status(); assert_eq!(status.as_u16(), 200); }
Anonymous functions that take a reference to a Request
as input and return a boolean
as output automatically implement the Match
trait.
The previous example could be rewritten as follows:
use wiremock::{Match, MockServer, Mock, Request, ResponseTemplate}; use wiremock::matchers::HeaderExactMatcher; use std::convert::TryInto; #[async_std::main] async fn main() { // Arrange let mock_server = MockServer::start().await; let header_name: http_types::headers::HeaderName = "custom".try_into().unwrap(); // Check that a header with the specified name exists and its value has an odd length. let matcher = move |request: &Request| { match request.headers.get(&header_name) { Some(values) => values[0].as_str().len() % 2 == 1, None => false } }; Mock::given(matcher) .respond_with(ResponseTemplate::new(200)) .mount(&mock_server) .await; // Even length let status = surf::get(&mock_server.uri()) .set_header("custom", "even") .await .unwrap() .status(); assert_eq!(status.as_u16(), 404); // Odd length let status = surf::get(&mock_server.uri()) .set_header("custom", "odd") .await .unwrap() .status(); assert_eq!(status.as_u16(), 200); }
Required methods
fn matches(&self, request: &Request) -> bool
Given a reference to a Request
, determine if it should match or not given
a specific criterion.
Implementors
impl Match for BodyExactMatcher
[src]
impl Match for HeaderExactMatcher
[src]
impl Match for MethodExactMatcher
[src]
impl Match for PathExactMatcher
[src]
impl Match for QueryParamExactMatcher
[src]
impl Match for Mock
[src]
impl<F> Match for F where
F: Fn(&Request) -> bool,
F: Send + Sync,
[src]
F: Fn(&Request) -> bool,
F: Send + Sync,
Implement the Match
trait for all closures, out of the box,
if their signature is compatible.