From 7831957091c82c5aa5d845b3555c0c870b888aa0 Mon Sep 17 00:00:00 2001 From: Ori Livneh Date: Sun, 17 Feb 2013 20:55:47 -0800 Subject: [PATCH] Add unit tests, demonstrating how to stub out deps. Physikerwelt asked for some guidance on how to write good unit tests for classes that depend on external resources. I wrote a few to serve as examples for additional tests. Because they have an ulterior didactic purpose, the comments are a bit more verbose than I would otherwise like, but despite that the tests are good enough to merit being merged. Change-Id: Ifa97eec1a68fb68b4744d1e5b192b410afe5ef68 --- tests/MathTexvcTest.php | 117 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 tests/MathTexvcTest.php diff --git a/tests/MathTexvcTest.php b/tests/MathTexvcTest.php new file mode 100644 index 0000000..fd12178 --- /dev/null +++ b/tests/MathTexvcTest.php @@ -0,0 +1,117 @@ +getMockBuilder( 'MathTexvc' ) + ->setMethods( array( 'readFromDB', 'callTexvc', 'doHTMLRender' ) ) + ->disableOriginalConstructor() + ->getMock(); + + // When we call render() below, MathTexvc will ... + + // ... first check if the item exists in the database cache: + $texvc->expects( $this->once() ) + ->method( 'readFromDB' ) + ->with() + ->will( $this->returnValue( true ) ); + + // ... if cache lookup succeeded, it won't shell out to texvc: + $texvc->expects( $this->never() ) + ->method( 'callTexvc' ); + + // ... instead, MathTexvc will skip to HTML generation: + $texvc->expects( $this->once() ) + ->method( 'doHTMLRender' ); + + $texvc->render(); + } + + /** + * Test behavior of render() upon cache miss. + * If the rendered object is not in the cache, MathTexvc will shell + * out to texvc to generate it. If texvc succeeds, it'll use the + * result to generate HTML. + * @covers MathTexvc::render + */ + function testRenderCacheMiss() { + $texvc = $this->getMockBuilder( 'MathTexvc' ) + ->setMethods( array( 'readCache', 'callTexvc', 'doHTMLRender' ) ) + ->disableOriginalConstructor() + ->getMock(); + + // When we call render() below, MathTexvc will ... + + // ... first look up the item in cache: + $texvc->expects( $this->once() ) + ->method( 'readCache' ) + ->will( $this->returnValue( false ) ); + + // ... on cache miss, MathTexvc will shell out to texvc: + $texvc->expects( $this->once() ) + ->method( 'callTexvc' ) + ->will( $this->returnValue( MW_TEXVC_SUCCESS ) ); + + // ... if texvc succeeds, MathTexvc will generate HTML: + $texvc->expects( $this->once() ) + ->method( 'doHTMLRender' ); + + $texvc->render(); + } + + /** + * Test behavior of render() when texvc fails. + * If texvc returns a value other than MW_TEXVC_SUCCESS, render() + * returns the error object and does not attempt to generate HTML. + * @covers MathTexvc::render + */ + function testRenderTexvcFailure() { + $texvc = $this->getMockBuilder( 'MathTexvc' ) + ->setMethods( array( 'readCache', 'callTexvc', 'doHTMLRender' ) ) + ->disableOriginalConstructor() + ->getMock(); + + // When we call render() below, MathTexvc will ... + + // ... first look up the item in cache: + $texvc->expects( $this->any() ) + ->method( 'readCache' ) + ->will( $this->returnValue( false ) ); + + // ... on cache miss, shell out to texvc: + $texvc->expects( $this->once() ) + ->method( 'callTexvc' ) + ->will( $this->returnValue( 'error' ) ); + + // ... if texvc fails, render() will not generate HTML: + $texvc->expects( $this->never() ) + ->method( 'doHTMLRender' ); + + // ... it will return the error result instead: + $this->assertEquals( $texvc->render(), 'error' ); + } +}