PostMock is a powerful mocking framework that uses Postman.
It brings Postman into your application and provides the following capabilities:
- Mock any request with responses from Postman.
- View network calls linked to postman requests.
Find our public api collection in Postman called PostMock. Which we used in demo app inside.
![image](https://private-user-images.githubusercontent.com/19667729/343737458-adf22cc4-5f35-4684-9bb7-6271c8b23091.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3Mzc0NTgtYWRmMjJjYzQtNWYzNS00Njg0LTliYjctNjI3MWM4YjIzMDkxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIyZmExZjc2MjM3ZTdiZDI5YTMxODM3NTc0NzQ3Zjk1OWQyNmQ2NzZiNDZkNTE4OGQ1OTA4ZjgxMmFlY2FhYTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.TjHrnUolwMCzucxaObR7yOijo9kQzRzkixnL9o4Tf4s)
![image](https://private-user-images.githubusercontent.com/19667729/343740010-e7510abf-ac28-438d-a506-c3bc8239a37c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDAwMTAtZTc1MTBhYmYtYWMyOC00MzhkLWE1MDYtYzNiYzgyMzlhMzdjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc2ZjJlMGRkMmFkNjZkN2I3NjNlYjgxNjg0YTg4MjQyYjY1ZjI1NDM5ODM1ZjZmZDI1OTQyYjU3M2Q3M2ZhZTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.zqWf39F1FjYapsNKreKuP0nP0kFF5cB-TbrMGFo5hzk)
![image](https://private-user-images.githubusercontent.com/19667729/343744866-b01a89f3-9de8-4f77-80b1-069571d717b3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDQ4NjYtYjAxYTg5ZjMtOWRlOC00Zjc3LTgwYjEtMDY5NTcxZDcxN2IzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdjZDk0YzczZTYyNDdjY2E1YWRkOWVjMzVhMTJkZjMwOTlkYTE4MWM3YjVkMzU2MzhkN2FmMjI4M2I3Zjg3MDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.EYLkT9hZ2QLey0jLRnw2_6VcjFlJjNruGG1XVu78lZk)
![image](https://private-user-images.githubusercontent.com/19667729/343746292-074e6043-8dda-43b7-ae97-ef5c1bee6a1b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDYyOTItMDc0ZTYwNDMtOGRkYS00M2I3LWFlOTctZWY1YzFiZWU2YTFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ5ZDgwYTU5ZDdjZDRhYjA3YjI1YjJjMjU3NTZiODYyNjVmNDFhYjU5MTdlNmQ2ZjdkYWY5ZTYxY2FkNTNmN2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.2mE9_emeH9eTggADt2qDbxtUZqJGFqeld3pN0TrMwTk)
![image](https://private-user-images.githubusercontent.com/19667729/343744413-fb37210b-b6ec-41b4-a95f-1df860baf15c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDQ0MTMtZmIzNzIxMGItYjZlYy00MWI0LWE5NWYtMWRmODYwYmFmMTVjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTlhN2FiYjViZjg2MTZiMmY4NWJlOTVmZTdjY2EwYTg3NTMxNDU0MWNjYjI1YjE0MzE0MWI4MjNkZDAyNTYyN2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.RpbrEG445jL9LU8j8jpdvAlgxGoq7BuWtnUDvDPrr6I)
![image](https://private-user-images.githubusercontent.com/19667729/343747750-9831a53c-3419-491f-a45d-fc00515d4430.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDc3NTAtOTgzMWE1M2MtMzQxOS00OTFmLWE0NWQtZmMwMDUxNWQ0NDMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgyOWJiNmZjZTJjNDViMDU1MDI5NGQxYzdmNWU0MDI2ZmYxMWVkNTQxYjU2OTVkNWNhMTliZjBiMGY3ZTRmNWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Kyui9WJgy-6-PGWH4ctjax1XYLKykIO0I1lY7EeLUDw)
![image](https://private-user-images.githubusercontent.com/19667729/343747888-19a74213-88cf-4bae-9864-feb61833ef8c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NDc4ODgtMTlhNzQyMTMtODhjZi00YmFlLTk4NjQtZmViNjE4MzNlZjhjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBmMDA1M2UwNTE3NTE5YmY2NmU1NDkxZmFmNmE3ZjE2ZDRkZGJlN2UwOWYxNmQzMDZiNzJjMTc4Nzk1MTI3NmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.EPXKW9wfw2pYH87Dkq4YLePSmpT8xnW9NqbABb8AB7I)
import PostMockSDK
struct ContentView: View {
var body: some View {
DogsList()
// Add PostMock button or use PostMockView direclty and add it to any view you wan't, or call it on shake.
.overlayPostMockButton()
.onAppear {
// Provide your POSTMAN_API_KEY and WORKSPACE_ID wich api collections you want to use
let config = PostMock.Config(apiKey: "<POSTMAN_API_KEY>",
workspaceID: "<WORKSPACE_ID>")
PostMock.shared.configurate(with: config)
/// Add some environment variables (optional), see description below
PostMock.shared.environment.set(key: "host",
scope: .request,
provider: { "https://dogapi.dog" })
}
}
}
You also need MockServer in Postman for api collection.
To match requests from the app to Postman requests, we can use templates or set a specific header x-postmock-request-id
to the request.
![image](https://private-user-images.githubusercontent.com/19667729/343754790-43948f10-51dc-4557-be19-0e5db9d378d3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NTQ3OTAtNDM5NDhmMTAtNTFkYy00NTU3LWJlMTktMGU1ZGI5ZDM3OGQzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ3ZjE4ZDVlZjNiNzkwMDhiZTc1ZDczMzdmZmQzOGVlMTQ0ZDg5YzE0MjgyYmRmNTI2NWY0YjgwMWY3ZmE2ODYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.iT5ol8W6_NFbu4Oi59hxqs72DQWoPhgLHgYX5zpQVnQ)
You can provide some variables to make the mock more specific.
![image](https://private-user-images.githubusercontent.com/19667729/343755623-71ca1321-743b-47c8-9c1e-aba542cef173.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NTU2MjMtNzFjYTEzMjEtNzQzYi00N2M4LTljMWUtYWJhNTQyY2VmMTczLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIyZmVmMWE3ZTBlM2Y5YmY1NmE2NTZhZGViZTI2MTFkYTNkMDE2ODRlNGZhNzI3ZWJmNzYzZWQxNjUwMjdiZGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.UfUyNoeW0excbaZaEH8gWq1eCXbnIYLZdXGBMuLcrEs)
Some of these variables are global and are applied to any request containing the placeholder.
![image](https://private-user-images.githubusercontent.com/19667729/343756569-0f681a1a-2a7e-4203-b695-759eb71c9f8f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTk2MTE2MzIsIm5iZiI6MTcxOTYxMTMzMiwicGF0aCI6Ii8xOTY2NzcyOS8zNDM3NTY1NjktMGY2ODFhMWEtMmE3ZS00MjAzLWI2OTUtNzU5ZWI3MWM5ZjhmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjI4VDIxNDg1MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWYwMjU1YWFiYjlkMjRjMGY2OGY4MTZlMDU2MTc4MTRhMjczNmMxODc2YjNkNDQwMDUyZDY0YjMyNGQxMzEwNTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0._3TO33_KnJdp7FoYhThDrN4X76gWsj9gJsHw8RIvcpg)
We set them up in the code:
PostMock.shared.environment.set(key: "host",
scope: .request,
provider: { "https://dogapi.dog" })
If you do not specify global variables like {{host}}
, they will be matched to any string.
It’s not a problem when you have only one host for requests.
You can mock some request in preview or tests. There is opportunity to set mock from code:
/// response id from postman
let mastiff200 = "1122734-8c545657-d643-4db4-b216-d16d699b27fa"
/// Default MockServer from workspace https://www.postman.com/universal-moon-430028/workspace/postmock
PostMock.shared.mockServer = MockServer(host: "0997c312-c8ea-435a-8ffd-4a98f4214024.mock.pstmn.io")
Mock
.request("GET", url: "{{host}}/api/v2/facts")
.with(responseID: .mastiff200)
.set()
PostMock.shared.mockIsEnabled = true