Mock web API requests with Nodejs for use in front-end testing.
Allows you to write tests that run all the way up to the API endpoint for deep integration testing.
Supports any browser-based Javascript testing framework. Currently has command line(via PhantomJS) support for Jasmine.
Nodejs, PhantomJS, and NPM.
apimok is available as a package via NPM. This is the recommended way to install and update Apimok.
npm install apimok
To pull the apimok client library into your test runner:
<script src="/apimok-lib"></script>
This will automatically pull the current client library into your page. Note that the apimok server runs on port 3001 by default(configurable from command line using the -p flag).
If you are running Jasmine, use the following as a template for your SpecRunner.html. It pulls in both the client library and the JUnitXmlReporter(Optional).
<!DOCTYPE HTML>
<html>
<head>
<title>Jasmine Spec Runner</title>
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<!-- ApiMok library REQUIRED-->
<script type="text/javascript" src="/apimok-lib"></script>
<!-- JUnitXmlReporter OPTIONAL -->
<script type="text/javascript" src="/junit-xml-reporter"></script>
<!-- include source files here... -->
<script type="text/javascript" src="src/Player.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="spec/PlayerSpec.js"></script>
<script type="text/javascript">
(function() {
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmine.getEnv().addReporter(new jasmine.TrivialReporter()); //REQUIRED
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter()); //OPTIONAL
jasmine.getEnv().execute();
}
})();
</script>
</head>
<body>
</body>
</html>
Create a new mok
var mokServer = new ApiMok();
mokServer.mok({
url: 'api/test',
verb: 'GET',
returnValue: {
id: 1,
name: 'Test'
}
});
mokServer.mok({
url: 'api/test',
verb: 'POST',
returnValue: {
success: true
}
});
Now anytime your code hits the endpoint at 'api/test' using a 'GET' request, the object assigned to returnValue will be returned as Json. Same with the POST below it.
Remove moks
mokServer.destroyAll();
This will remove all moks that are currently stored in the server. Generally part of a TearDown sequence.
Check out the /samples directory for some working examples.
Currently, cross-domain requests are not supported. This poses 2 limitations: 1) API requests must be relative to your application in order to be mocked. (a call to "http://api.yourmain.com/user" cannot be mocked). 2) Your test specs must be included somewhere under your app's root direction(this is typical anyway).
A solution to #1 will be available in a later relase, as there is more involved than simply enabling cross-domain requests. For #2, the apimok node module also serves as a static file server. All you have to do is tell it where your application is when you start the server:
cd /path/to/application
apimok --with jasmine --target app-test/specrunner.html
To see all options run apimok.
Apimok will now spin up its server and run all the tests at http://localhost:3001/app-test/specrunner.html using PhantomJs. Output will appear in the console.
If you prefer to run the server and browse to the output page(or you are using a framework that is NOT Jasmine) in your browser, run the apimok command without flags(working directory should be your app root). With the server running, open your test output page in the browser by going to http://localhost:3001/path/to/testrunner to run your tests.
- Does not support cross-domain api requests so your test suite must run with the node server.
- Only supports Json responses.
- Support for more testing frameworks in the command line
- Integration with common CI servers(CruiseControl, Jenkins)