This is the biggest challenge. What I find works is separating your orchestrations from your data processing.
For example, instead of creating one class that does the network call, and processes the JSON response, break these out.
One class does the network call (keep it extremely thin). Dependency inject stuff in if you want. But view this purely as an orchestration.
if (connectionValid)
json = makeNetworkCall
anotherObject.processJson(json) <- test separately
end
Then, in the other plain old data process class, do you heavy off-by-one edge case testing there.
If the first case, the orchestration, I can write tests like "One make the network call if the connection is valid". But that's all that test would do.
I am at the point now where I actually don't even test that. I assume that is going to work, because it is so simple. That and I generally hate mocking. Way too much coupling. Way too hard to refactor.
Where I do test heavy is on the plain old object side, that has no outside ports or connectors. These are just plain old objects.
I agree with some other comments I have ready here. Mocking is a bitch and I generally don't like it. But it's there if I needed it, so I do use it occasionally.
But it has so many downsides I try not to. Instead I separate the orchestrations from the processing. Unit test the processing (in an integration test sort of way), and try to stick to testing the public APIs of my class, so I am free to change the internals without things breaking.
Break through the blocks and win your inner creative battles.
Many books mentioned here are good, this is the only I haven't seen referenced. But this one book really helped me deal with resistance and get stuff done. Seth Godin is a big fan and references it a lot in his material.
Steven Pressfield also wrote 'The Legend of Bagger Vance' and Gates of Fire (Spartan 300 kind of book but way deeper).
First off - good for you for trying something. Thanks awesome.
Takes a lot of guts and hard work to put something out there so hats off to you for that.
As far as feedback, I think the Take a Tour screen is begging for a picture or something to show me at a glance how it works.
I would try to add more pictures to the site as it is currently all text (at least what I saw). Even it is just a piggy bank or something - show me how I am going to save money. Or make me feel the pain.
But I think a picture would really spruce things up.
No, the example doesn't cheat.
You hit on the point of the example.
With batch processing, and large levels of inventory you have a lot of idle inventory (waste).
Adding two extra people to work on the idle inventory (instead of having it sit there) isn't cheating.It's not letting inventory sit idle, build up, and collect defects because of a bad production run.
For example, instead of creating one class that does the network call, and processes the JSON response, break these out.
One class does the network call (keep it extremely thin). Dependency inject stuff in if you want. But view this purely as an orchestration.
if (connectionValid) json = makeNetworkCall anotherObject.processJson(json) <- test separately end
Then, in the other plain old data process class, do you heavy off-by-one edge case testing there.
If the first case, the orchestration, I can write tests like "One make the network call if the connection is valid". But that's all that test would do.
I am at the point now where I actually don't even test that. I assume that is going to work, because it is so simple. That and I generally hate mocking. Way too much coupling. Way too hard to refactor.
Where I do test heavy is on the plain old object side, that has no outside ports or connectors. These are just plain old objects.
I agree with some other comments I have ready here. Mocking is a bitch and I generally don't like it. But it's there if I needed it, so I do use it occasionally.
But it has so many downsides I try not to. Instead I separate the orchestrations from the processing. Unit test the processing (in an integration test sort of way), and try to stick to testing the public APIs of my class, so I am free to change the internals without things breaking.
My 2c. Hope that helps.