nock

Creator: coderz1093

Last updated:

Add to Cart

Description:

nock

Nock #
HTTP requests mocking library for dart and flutter.
Nock can be used to test modules that perform HTTP requests in isolation.
Inspired by nock
Installing #
Add dev dependency to your pubspec.yaml:
dev_dependencies:
nock: ^1.2.3
copied to clipboard
Basic usage example: #
import 'package:test/test.dart';
import 'package:http/http.dart' as http;
import 'package:nock/nock.dart';

void main() {
setUpAll(() {
nock.init();
});

setUp(() {
nock.cleanAll();
});

test("example", () async {
final interceptor = nock("http://localhost/api").get("/users")
..reply(
200,
"result",
);

final response = await http.get("http://localhost/api/users");

expect(interceptor.isDone, true);
expect(response.statusCode, 200);
expect(response.body, "result");
});
}
copied to clipboard
No mock found #
if some request isn't mocked NetConnectionNotAllowed exception will be thrown:
void main() {
test("example", () async {
expect(
http.get("http://localhost/api/users"),
throwsA(TypeMatcher<NetConnectionNotAllowed>()),
);
});
}
copied to clipboard
API #
Creating requests scope #
final String baseUrl = "https://my-server.com";
final scope = nock(baseUrl);
copied to clipboard
Methods for creating interceptors #

scope.get(dynamic url) -> Interceptor
scope.post(dynamic url, dynamic body) -> Interceptor
scope.put(dynamic url, dynamic body) -> Interceptor
scope.delete(dynamic url, dynamic body) -> Interceptor
scope.patch(dynamic url, dynamic body) -> Interceptor
scope.head(dynamic url, dynamic body) -> Interceptor

Using default base url #
You could specify baseUrl for automatic scope usage:
void main(){
setUpAll((){
nock.defaultBase = "http://localhost/api";
nock.init();
});

test("example", () async {
nock.get("/users"); // create mock for GET http://localhost/api/users
});
}
copied to clipboard
Url matching #
You could use strings, regexp or any matcher from package:test:
final topicsInterceptor = nock.get("/topics")
..reply(200);

final usersInterceptor = nock.get(startsWith("/users"))
..reply(200);

final tagsInterceptor = nock.get(RegExp(r"^/tags$"))
..reply(200);
copied to clipboard
Specifying request headers #
final interceptor = nock.get("/users")
..headers({
'Session-Token': '59aff48f-369e-4781-a142-b52666cf141f',
})
..reply(200);
copied to clipboard
Specifying request query string #
Using query string:
final interceptor = nock.get("/users")
..query("ids[]=1&ids[]=2")
..reply(200);
copied to clipboard
Using example:
final interceptor = nock.get("/users")
..query({"id": 5})
..reply(200);
copied to clipboard
Using matchers:
final interceptor = nock.get("/users")
..query(startsWith("something"))
..reply(200);

final interceptor = nock.get("/users")
..query({'id': anyOf([1, 2, 3])})
..reply(200);
copied to clipboard
Using custom match function:
final interceptor = nock.get("/users")
..query((Map<String, List<String>> params) => true)
..reply(200);

// or

final interceptor = nock.get("/users")
..query((Map<String, String> params) => true)
..reply(200);
copied to clipboard
Specifying request body #
Interceptor will parse HTTP request headers and try parse body.
Supported mime-types:

application/x-www-form-urlencoded
application/json
application/text
application/text

Using example:
final interceptor = nock.post(
"/users",
{
"name": "John",
"email": "john_doe@gmail.com",
},
)
..reply(204);
copied to clipboard
Using matchers:
final interceptor = nock.post(
"/users",
{
id: anyOf([1, 2, 3])
name: any,
email: TypedMather<String>(),
},
)
..reply(204);
copied to clipboard
Using custom match function:
final interceptor = nock.post(
"/users",
(body) => body is Map,
)
..reply(204);
copied to clipboard
If you send binary data you could use custom raw match function:
final interceptor = nock.post(
"/users",
(List<int> body) => true,
)
..reply(204);
copied to clipboard
Specifying reply #
application/json:
final interceptor = nock.get("/users")
..reply(200, [
{
"id": 1,
"name": "John",
"email": "john_doe@gmail.com",
},
{
"id": 2,
"name": "Mark",
"email": "zuckerberg@gmail.com",
},
]);
copied to clipboard
text/plain:
final interceptor = nock.get("/ping")
..reply(200, "pong");
copied to clipboard
Other binary data:
final interceptor = nock.get("/video")
..reply(200, <int>[73, 32, 97, 109, 32, 118, 105, 100, 101, 111]);
copied to clipboard
Specifying reply headers #
Other binary data:
final interceptor = nock.get("/auth")
..reply(204, null, {
"Session-Token": "59aff48f-369e-4781-a142-b52666cf141f",
});
copied to clipboard
Persistent requests #
To repeat responses for as long as nock is active, use .persist().
final users = nock.get("/users")
..persist()
..reply(
200,
"result",
);
copied to clipboard
Note that while a persisted mock will always intercept the requests, it is considered "done" after the first interception.
Canceling pending mock:
users.cancel();
copied to clipboard
Do something after reply #
final users = nock.get("/users")
..persist()
..reply(
200,
"result",
)
..onReply(() => print("I'm done"));
copied to clipboard
Contributions Welcome! #
Feel free to open PR or an issue

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.