2014-10-01 70 views
0

我试图测试一个视图,该视图改变了数据库中对象的状态,然后将其保存回来。问题是,我不能让我的单元测试使用这个视图,即使如果我用我的真实数据库尝试视图,它完美的工作。如何测试在Django中修改数据库数据的视图?

这是视图:

@login_required 
def publicar_investigacion(request,id): 
    context = RequestContext(request) 

    try: 
     inv = Investigacion.objects.get(pk=id) 
     inv.estado = 1 
     inv.save() 
    except Investigacion.DoesNotExist: 
     pass 

    return HttpResponseRedirect('/admin/guatepediaapp/investigacion') 

,这是我的单元测试:

def test_ResultAprobarInvestigacion(self): 
     inv = Investigacion.objects.create(pk=100,fecha=timezone.now()) 
     request = RequestFactory() 

     user = User.objects.create_user(
      username='pablo', email='[email protected]', password='miSuperContraseniaa secreta') 
     request.user = user 

     response = v.publicar_investigacion(request,100) 


     self.assertEqual(inv.estado, 1) 

It's值得一提的是,可变埃斯塔的defaul状态时我创建Investigacion是2

这是我得到的运行测试时:

Failure 
Traceback (most recent call last): 
    File "C:\xampp\htdocs\guatepedia\guatepedia\Guatepedia\guatepediaapp\tests.py", line 34, in test_ResultAprobarInvestigacion 
    self.assertEqual(inv.estado, 1) 
AssertionError: 2 != 1 

感谢您的帮助

回答

1

在测试的inv变量和一个在视图中是不一样的,即使他们是指相同的数据库行:改变一个不会在其他显示。您需要在调用测试之后加载测试中的一个:将inv = Investigacion...一行向下移至response行之后。

+0

你好。我不认为我可以这样做,因为如果我在视图之后创建对象,我不会有任何ID发送到视图。但是也许我没有正确理解您的答案。感谢您的帮助 – 2014-10-01 18:30:05

+0

好,好点。在这种情况下,您需要在调用视图后重新加载它,方法是执行'inv = Investigacion.objects.get(pk = inv.pk)'。 – 2014-10-01 18:45:34

+0

非常感谢!它工作完美:) – 2014-10-03 17:02:50

0

我的猜测是Investigacion.DoesNotExist异常被引发。你可以试试这个,而不是对pk进行硬编码。

def test_ResultAprobarInvestigacion(self): 
     inv = Investigacion.objects.create(fecha=timezone.now()) 
     request = RequestFactory() 

     user = User.objects.create_user(
      username='pablo', email='[email protected]', password='miSuperContraseniaa secreta') 
     request.user = user 

     response = v.publicar_investigacion(request,inv.id) 


     self.assertEqual(inv.estado, 1) 
+0

感谢您的回答,但我仍然得到同样的错误。 – 2014-10-01 18:27:28