Django是否认出了我的模拟对象?

时间:2014-03-04 21:00:05

标签: python django unit-testing

我真的在努力测试和模拟对象。我正在编写我知道可行的代码测试 - 我所要做的就是进行基本的测试,以确保我得到一个200的response.status_code,但是我得到的是404.

url.py

url(r'^(?P<model_name>[-\w]+)/(?P<pk>\d+)/$',
    crud_views.connect_detail_view, name='detail'),

tests.py

class SimplePageLoadsTestCase(TestCase):

    def setUp(self):
        user = User.objects.create_user('admin', 'admin@dowjones.com', 'admin')
        self.client.login(username='admin', password='admin')
        mock_application = mock.Mock(spec=Application, pk=1)

    def test_detail_application_view(self):
        response = self.client.get(reverse('detail', kwargs={'model_name': 'application', 'pk':1}))
        self.assertEqual(response.status_code, 200)

我收到了AssertionError: 404 != 200,这在调试方面没有太大帮助(有哪些改进点?)

我注意到pdb,如果我在setUp中放置断点,我可以访问Mock对象,但是如果我将断点放在测试本身中则不行。我尝试在测试中定义mock_application;我可以访问它,但仍然有404。

1 个答案:

答案 0 :(得分:3)

正如您所说,该视图需要现有的PK。大概在这个视图中有类似的东西:

application = get_object_or_404(Application, pk=1)

但问题是,正如评论所说,你的Mock对象是测试代码本身的本地对象。即使您将其移动到特定的测试方法中,它仍然不会影响该方法中的get_object_or_404调用。

在Django单元测试中处理这类事情的方法就是在setUp方法中创建(并保存)模型实例。 Django为测试创建了一个单独的数据库,并在测试结束时销毁它,因此这是非常安全的(即使它确实将“单元”测试的定义扩展为依赖于数据库适配器)。