I've gotten back to playing with this. What I've ended up doing is monkey-patching render to send the signal django.test.Client is expecting from the template backend. Paraphrasing my (python 3.7) code:
from unittest.mock import patch
from django.test.signals import template_rendered
from django.shortcuts import render
class TimelineViewTest(TestCase):
@patch('spi.views.render')
def test_context_includes_tag_list(self, mock_render):
def render_patch(request, template, context):
template_rendered.send(sender=self, template=template, context=context)
return render(request, template, context)
mock_render.side_effect = render_patch
At least doing it this way puts all the weird stuff in my test code. I didn't have to touch anything in my production view code (or in either django or jinja).