This package exists to help you make testing stubs. Its not to help you do patch mocks into code: for that see Mocking.jl. The stubs created using ExpectationStubs are suitable for patching in with Mocking.jl.
These stub are ideal for if you already have dependency injection of functions set up.
We consider for the purpose of this package a
stub to be a simplified function that returns a fixed value for a fixed input.
Expectation Stups is all about the Arrange, Act, Assert style of unit testiong:
There are 5 key functions (check their docstrings on the REPL).
@stub foo: declares a stub called
@expect foo(::Integer, 8.5)=77: sets up an expectation that
foowill be called with an
Integerand the exact value
8.5. and if so it is to return
@used foo(100, ::Real)checks to see if
foowas called with the the exact value
100and something of type
@usecount foo(100, ::Real)as per
@usedexcept returns the number of times called
all_expectations_used(foo)checks that every expectation declared on
foowas used (returns a
Lets say I have a function that checks on the status of say some pipe
and if it has too much pressure, takes some response:
normally calling a function called
function check_status(pressure, its_bad_callback=email) if pressure > 9000 its_bad_callback("firstname.lastname@example.org", "Darn it Phil, the thing is gonna blow") return false end true end
Now, when testing this function out, I don't want Phil to get 100s of emails.
So I want to replace the
its_bad_callback with some mock.
So I could write a little closure in my testing code, and have that closure set a variable and then check that variable, to see how it was called. And that is pretty good. But it is a bit adhock.
using Base.Test using ExpectationStubs @testset "Check the pipe" begin @stub fakeemail @expect fakeemail("email@example.com", ::AbstractString) = nothing # no return # check what happens if everything is OK @test check_status(1000, fakeemail) == true @test !@used fakeemail("firstname.lastname@example.org", ::Any) ### Better not email Phil if everything is going ok. @test check_status(9007, fakeemail) == false @test @used fakeemail("email@example.com", ::Any) end
8 months ago