4 ms·
Got it. One problem I've run into, is that these things tend to proliferate into a dozen or so global things that people need to remember to deal with (clean u
by lbayes 5y ago
Got it.
One problem I've run into, is that these things tend to proliferate into a dozen or so global things that people need to remember to deal with (clean up and/or configure) in the test environment.
Since my brain doesn't do memory well, I start getting intermittent test failures from interacting tests that can be painful to debug.
Another problem is that they tend to make the test environment really slow because the fix is often to add a pre or post handler to every single test globally.
Also, the feature might be designed for environment A, but later need to run in environment B. Global state patterns tend to blow up when that happens.
The DB::SetupMock() thing tends to work okay for direct consumers, it's bad when the transitive dependencies need to start doing that for 6-10 different services.
FWIW, I commented elsewhere with an alternative structure that's been working well for me with a different set of trade-offs.
Also FWIW, I've been fighting against global state for so many years, it makes me really sad to see it getting promoted again.
Best of intentions here, not trying to be critical, just trying to share some hardwon experience.
- downsplat 5y agoWhat you say makes lots of sense, I think the best design depends on many other factors, like the size of the codebase, the size of the team, and how modularity is handled within the whole system. What made sense for my project might not make sense for another. And yes, I agree that if something needs to be a module that can be used in unrelated projects, it should not depend on global state... unless those projects are explicitly defined to share a common programming environment, in which case they are not pure modules anymore. My point, maybe going a bit meta, is that no matter how you organize it in terms of which language features you are using, application code effectively does depend on its running environment, and the information from those dependencies needs to get there somehow.