Concepts
laika
is a combination of technologies including phantomjs
, mocha
, meteor
itself, and some tricks. In this section you’ll be learning how laika works internally. It will help you write better tests and understand why laika is a bit slower than other testing frameworks.
Testing with the actual app
laika
doesn’t do mocking or stubbing. Your tests will be tested against your actual Meteor app and using real browsers (phantomjs
in this case). laika
’s focus is on writing tests for both the client and server. We don’t need to build another test suite, so we use mocha
internally.
Each test will run on its own app and a separate database
Best thing about laika is, each test will run against a separate process of your app and with a clean database. This is really good since your tests are isolated from each another. It’s a bit slower, but we’ve sped things up in a few ways:
- Fast mongod process with these options -
mongod --smallfiles --noprealloc --nojournal
- Pooling apps so you don’t need to wait for the app to get loaded
- Running
mongod
on a ramdisk - see this guide
There are some other ways to increase the speed, but not yet tested:
- Use parallel testing (
mocha
does not support this, and writing a test suite from the ground up is not cool)
The server and your test communicate via a TCP connection
- At the beginning of the test,
laika
will inject a code block that runs on the server into your Meteor app - When your app starts, it will start a TCP connection so your test can communicate with the server
- The test sends its code over TCP and the injected code will
eval()
it - The result of the
eval()
is sent back via TCP (usingemit()
, which you’ve seen in the Getting Started guide)
Client code is evaluated in a real browser
- We use
phantomjs
for this. It’s a headless browser (meaning no graphical interface is required), based on WebKit. - Your test code will be evaluated on the client with phantomjs’s
evaluate()
method and by injecting a small piece of code into your meteor app.
All the injected code will be removed
- Injected code can be used to exploit your app in production
- But don’t worry - we’ll remove it after the test
- You can check that with
git diff
:)