[TIP] Making mock objects that call the original function

Kevin Tran hekevintran at gmail.com
Thu May 16 16:46:45 PDT 2013


The mock objects in the Jasmine testing framework have a `andCallthrough()` method.  This allows you have a mock that when called, calls the original function.  An example:

    describe("A spy, when configured to call through", function() {
      var foo, bar, fetchedBar;

      beforeEach(function() {
        foo = {
          setBar: function(value) {
            bar = value;
          },
          getBar: function() {
            return bar;
          }
        };

        spyOn(foo, 'getBar').andCallThrough();

        foo.setBar(123);
        fetchedBar = foo.getBar();
      });

      it("tracks that the spy was called", function() {
        expect(foo.getBar).toHaveBeenCalled();
      });

      it("should not effect other functions", function() {
        expect(bar).toEqual(123);
      });

      it("when called returns the requested value", function() {
        expect(fetchedBar).toEqual(123);
      });
    });

The only way I know how to do this in the Python mock library (http://www.voidspace.org.uk/python/mock/) is by setting the original function manually:

    with patch('my_project.forms.create_user') as mock_create_user:
        mock_create_user.side_effect = create_user
        client.post('/signup/', data)
        self.assertEqual(1, mock_create_user.call_count)
        self.assertEqual(1, User.objects.count())

Is there a better built-in way to do this?


More information about the testing-in-python mailing list