Tests are to stop the future programmer from breaking your code.
function do_add(a, b, add) {
return add(b, a);
}
And does something like: do_add(1, 2, add)
expect(add) to be called with (2, 1)
Then the function is changed to: function do_add(a, b, add) {
return add(a, b);
}
Oops, broke the test. Is this a type of behavior change that you expect would break the test? Often there are many ways to correctly do something and a good test should allow any of them.This is especially the case when tests rely on mocks, which don't really implement the BEHAVIOR of a dependency, but rather represent a "replay" of a specific call stack sequence.