Search code examples
meteorjasminemeteor-velocity

How to unit test collection methods with velocity/jasmine


I'm completely new to javascript testing and I am trying to get a grasp on how to approach testing methods that touch the database

For example, I have this method that returns true if there are any documents in the db matching the query

Payments = new Mongo.Collection('payments');

_.extend(Payments, {
  hasAnyPayments: function(userId) {
    var payments = Payments.find({ userId: userId });
    return payments.count() > 0;
  }
});

So far I have only written the structure that I think is correct, but I am pretty lost

describe('Payments', function() {
  describe('#hasAnyPayments', function() {
    it('should return true when user has any payments', function() {

    });

  });
});

Are such tests even supposed to touch the database? Any advice is much appreciated


Solution

  • Unless you are manually inputting data into Mongo manually (or outside of Meteor) then you don't need to test the database.

    What you should be testing, are the execution paths in your code.

    So for the case above, hasAnyPayments is a unit that finds all user payments and returns true if there are more than 0. So your test would look something like this:

    describe('Payments', function() {
      describe('#hasAnyPayments', function() {
        it('should return true when user has any payments', function() {
    
            // SETUP
            Payments.find = function() { return 1; } // stub to return a positive value
    
            // EXECUTE
            var actualValue = Payments.hasAnyPayments(); // you don't really care about the suer
    
            // VERIFY
            expect(actualValue).toBe(true);
        });
    
      });
    });