我真的在努力测试和模拟对象。我正在编写我知道可行的代码测试 - 我所要做的就是进行基本的测试,以确保我得到一个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。
答案 0 :(得分:3)
正如您所说,该视图需要现有的PK。大概在这个视图中有类似的东西:
application = get_object_or_404(Application, pk=1)
但问题是,正如评论所说,你的Mock对象是测试代码本身的本地对象。即使您将其移动到特定的测试方法中,它仍然不会影响该方法中的get_object_or_404调用。
在Django单元测试中处理这类事情的方法就是在setUp
方法中创建(并保存)模型实例。 Django为测试创建了一个单独的数据库,并在测试结束时销毁它,因此这是非常安全的(即使它确实将“单元”测试的定义扩展为依赖于数据库适配器)。