diff --git a/README.md b/README.md index c8613ce..a526db9 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ working across different projects via [VisualMode](https://www.visualmode.dev/). For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter). -_1758 TILs and counting..._ +_1759 TILs and counting..._ See some of the other learning resources I work on: @@ -1054,6 +1054,7 @@ If you've learned something here, support my efforts writing daily TILs by - [Iterate Over A Dictionary](python/iterate-over-a-dictionary.md) - [Keep A Tally With collections.Counter](python/keep-a-tally-with-collections-counter.md) - [Load A File Into The Python REPL](python/load-a-file-into-the-python-repl.md) +- [Look Inside Pytest tmp_path](python/look-inside-pytest-tmp-path.md) - [Override The Boolean Context Of A Class](python/override-the-boolean-context-of-a-class.md) - [Parse Relative Time To datetime Object](python/parse-relative-time-to-datetime-object.md) - [Store And Access Immutable Data In A Tuple](python/store-and-access-immutable-data-in-a-tuple.md) diff --git a/python/look-inside-pytest-tmp-path.md b/python/look-inside-pytest-tmp-path.md new file mode 100644 index 0000000..e1bbdbb --- /dev/null +++ b/python/look-inside-pytest-tmp-path.md @@ -0,0 +1,41 @@ +# Look Inside Pytest tmp_path + +In [Isolate and Debug File Side-Effects with Pytest +`tmp_path`](https://www.visualmode.dev/isolate-and-debug-file-side-effects-with-pytest-tmp-path), +I wrote about how I use +[`tmp_path`](https://docs.pytest.org/en/stable/reference/reference.html#std-fixture-tmp_path) +in a Pytest fixture to test [my `py-vmt` CLI](https://github.com/jbranchaud/py-vmt). During testing of the CLI interface +via [`click`'s testing utilities](https://click.palletsprojects.com/en/stable/testing/), `vmt` creates, +modifies, and reads from files. Isolating that behavior with the `tmp_path` +fixture is useful because it prevents individual test cases from conflicting +with one another. + +Here is what the fixture looks like at the top of my test file: + +```python +# auto fixture for all test cases that monkeypatches the platform dirs to a tmp +# path so that test side-effects don't persist between runs +@pytest.fixture(autouse=True) +def use_tmp_platform_dirs(tmp_path, monkeypatch): + data_dir = tmp_path / "data" + config_dir = tmp_path / "config" + data_dir.mkdir() + config_dir.mkdir() + monkeypatch.setattr(CliContext, "get_data_dir", staticmethod(lambda: data_dir)) + monkeypatch.setattr(CliContext, "get_config_dir", staticmethod(lambda: config_dir)) +``` + +The root of the temp directory is located at `tempfile.gettempdir()` and the +directories from there are organized with this structure: + +``` +{temproot}/pytest-of-{user}/pytest-{num}/{testname}/ +``` + +So, in the case of `vmt`, I can find the `config` and `data` dirs for a specific +test run here: + +```bash +❯ ls /var/folders/zc/q6gnvbgx6kq77828jn38716r0000gn/T/pytest-of-lastword/pytest-2/test_start_status_stop_flow0 +config data +```