Mock object creation by example?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • John J. Lee

    Mock object creation by example?

    I had the bright idea a week or two ago to construct mock objects (for
    unit testing) "by example" by calling methods on a generic mock
    object.

    Say we have a class Bar, and we want to check that, when we use
    BarUser in a particular way, BarUser first calls method Bar.xyzzy with
    args "foo" and bar=2, then method Bar.do_nothing.

    # first, construct a mock object by example:
    m = Mock()
    m.xyzzy("foo", bar=2)
    m.do_nothing()

    # then run the test
    m.start_test()
    bu = BarUser(m)
    bu.method_a("fo o", 1, bar=2)
    bu.method_b()


    That's it, essentially.

    It does needs a bit more complication than that to be useful. For
    example, a way specifying return values and exceptions to be expected,
    a way of asking it to pretend to be a class object, ways of making
    slightly fuzzy the expected number and order of calls and their
    arguments, and the ability to easily inherit from Mock and override
    methods etc. For example, you might say:

    m.return_someth ing().returns(1 )
    m.raise_somethi ng().raises(Exc eption)


    Of course, it turns out somebody else thought of it first. For
    example, in Java:




    Anybody know if something like this already exists in Python?

    Actually, looking at the examples on mockcreator's web page does lead
    give you the suspicion that they've had some contact with a certain
    language <wink>:

    // setup of MockObjects
    MockFoo mockFoo = new MockFoo();
    mockFoo.expectD oSomething( "nobody expects", "the spanish inquisition" );

    // Testcode
    assertEquals( "the spanish inquisition", mockFoo.doSomet hing( "nobodyExpe cts" ) );

    // Verify
    mockFoo.verify( );


    John
Working...