Expand description
Anything that implements Match
can be used to constrain when a Mock
is activated.
Match
can be used to extend the set of matchers provided out-of-the-box by wiremock
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())
.header("custom", "even")
.await
.unwrap()
.status();
assert_eq!(status, 404);
// Odd length
let status = surf::get(&mock_server.uri())
.header("custom", "odd")
.await
.unwrap()
.status();
assert_eq!(status, 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())
.header("custom", "even")
.await
.unwrap()
.status();
assert_eq!(status, 404);
// Odd length
let status = surf::get(&mock_server.uri())
.header("custom", "odd")
.await
.unwrap()
.status();
assert_eq!(status, 200);
}
Required Methods
Implementors
impl Match for AnyMatcher
impl Match for BodyContainsMatcher
impl Match for BodyExactMatcher
impl Match for BodyPartialJsonMatcher
impl Match for HeaderExactMatcher
impl Match for HeaderExistsMatcher
impl Match for HeaderRegexMatcher
impl Match for MethodExactMatcher
impl Match for PathExactMatcher
impl Match for PathRegexMatcher
impl Match for QueryParamExactMatcher
impl Match for QueryParamIsMissingMatcher
impl<F> Match for F where
F: Fn(&Request) -> bool,
F: Send + Sync,
Implement the Match
trait for all closures, out of the box,
if their signature is compatible.