用于单元测试中后续请求的 Django ModelAdmin 对象?

Django ModelAdmin objects reused for subsequent requests in Unittests?

我正在尝试使用 Unittests 在 ModelAdmin 中重现一个(明显的)问题。

在 ModelAdmin 中,我在保存模型时执行了一些额外的操作。为此,我引入了新的实例变量 collection_page.

class MyModelAdmin(admin.ModelAdmin):
    ...
    def save_model(self, requset, obj, form, change):
        ...
        if obj_is_new:
            self.collection_page = ....
        ...
        self.collection_page   # <== AttributeError if obj is not new.

我使用 django.test.Client 测试模块两次,如下所示:

class CollectionAdminTestCase(django.test.TestCase):
    ...
    def test_redirect_after_editing_existing_object(self):
        self.client.post(
            self.creation_path,
            self.creation_post
        )
        response = self.client.post(
            self.change_path,
            self.change_post
        )
        self.assertEqual(
            response.status_code, 302
        )

测试通过,但应该会失败。

当我添加

        try:
            del self.collection_page
        except AttributeError:
            pass

MyModelAdminsave_model 方法的开头,测试失败了。

这是 Django 的预期功能吗?有更好的处理方法吗?

您绝对不应该在 ModelAdmin 对象上设置状态。它在服务器进程的生命周期内存在;在其上设置的任何内容都将在请求中保留。

你没有说你在用这个变量做什么,所以很难就如何最好地做它是什么提出建议;只是,不是这样。