I’ve got some logic that runs periodically and I want to include that
in my tests.
The closer to the cron event you get, the harder the testing is. Which
you want to test?
- the cron system works
- the cron file calls your function, not something else
- your function works.
The last one is highest risk, and you can test that out of normal unit
tests. So most crons should let the first two slide.
I guess, the test will need to modify the Time.now(), so that I can
trigger events to happen and also run some code, in the same way
script/runner would do.
I have experienced two general ways to mock the time. One is to mock
Time.now() so it returns some canned number that the time-dependent code
will relate to.
The other way is to set a previous time stamp wisely in the test
contrived example for an hourly cron:
last_cron: <%= 61.minutes.ago %>
So a test case that uses a :due_for_a_cron fixture record will always
correctly discover that the time is ripe for the next cron event.
I have found the fixture system to be much more robust than mocking
you simply must do that, use Mocha.