2016-04-21 103 views
0

通过Django开发一个简单的聊天系统 - 我已经实现了一些发送/接收消息的方法。测试django方法

例如(这不是我的实现,但只是一个例子一个从另一个聊天应用程序):

def post(request): 
    time.sleep(2) 
    if not request.is_ajax(): 
    HttpResponse (" Not an AJAX request ") 
    if request.method == 'POST': 
    if request.POST['message']: 
     message = request.POST['message'] 
     to_user = request.POST['to_user'] 
     ChatMessage.objects.create(sender = request.user, receiver = User.objects.get(username = to_user), message = message, session = Session.objects.get(session_key = request.session.session_key)) 

return HttpResponse (" Not an POST request ") 

现在,我有方法写入 - 我需要测试,看看是否被添加消息。在这一点上,我没有为I.e编写任何JavaScript。间隔刷新和等待消息等。我应该直接写入JS或先测试这个方法,看看它是否能正常工作,然后为它写JS?听起来像一个愚蠢的问题,但我发现很难理解我将如何去测试方法...

+0

根据[documentation](https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest.is_ajax),您需要设置HTTP_X_REQUESTED_WITH标头'XMLHttpRequest'字符串,当你写你自己的电话。我从来没有这样做,但只要你这样做,它应该用你可能用来测试的任何方法(curl,wget,Python中的东西...)。 –

回答

0

在我看来,这并不重要。你会发现很多开发人员都在测试之前,而且很多人都在测试之后。以您喜欢的任何顺序实施它。有些时候,如果在没有任何测试的情况下编写一个工作原型比较容易(尤其是在接口没有完成并且在开发过程中仍然会发生很大变化的情况下),在这种情况下,您不必每次都通过调整大量测试来浪费时间你必须改变一些接口。)。至少当你已经有最终的接口时,不要懒惰地写测试。

真正重要的是要有良好定义的接口。从后端角度来看,您将有一个接口实现(本例中为视图)和一个或多个接口用户:前端和测试都是后端实现的用户,但可能还有更多。拥有界面之后,你首先实现哪一个并不重要。通过嘲笑界面的一面,您可以实现另一面,而不需要原始版本的模拟面。例如,通过使用javascript代码嘲笑/伪造服务器响应(使用预先可能的常量数据),您只能编写一个没有任何后端代码的前端。你也可以先写后端,或者后端测试......你决定。 (前端/后端)你可以在接口上达成一致,然后在前端和后端都可以“模拟”(假)接口的另一端:前端球员编写一些模拟服务器响应的代码,使用一些伪造的数据,而后端人员编写一些测试,用一些假的请求来模拟客户端。通过这种方式,前端和后端团队不必等待对方完成代码,前端和后端都可以单独测试。当然,以后建议添加端到端(e2e)测试来测试连接在一起的整个堆栈。

再一次,真正最重要的是通常具有定义良好的接口,而不是围绕接口编写的代码。在蹩脚的系统中,问题通常是你只有没有接口的代码......如果一个系统在架构上构建良好,接口定义良好,那么在接口上编写的很多糟糕的代码是可以管理的。

如果django视图具有良好定义的界面,我通常会首先与测试一起开发后端。在你的情况下,django测试是非常简单的:你只需创建一个django测试客户端(https://docs.djangoproject.com/en/1.8/topics/testing/tools/#test-client),发布一些虚假的请求来模拟客户端,然后检查数据库是否包含期望的对象。

一些额外的建议:

  • 装饰你的观点与@require_POST
  • 我认为你不应该使用request.is_ajax()拒绝响应到客户端。通常用request.is_ajax()来找出客户端需要什么样的响应。如果POST请求是通过html页面的形式发送的,那么您希望生成另一个html页面作为响应。如果请求是使用ajax发送的,那么你通常想用可处理的数据(json,xml等)来响应,而不是html。
0

由于您的方法必须有客户端提出的请求,然后提供HttpResponse(整体),您只能通过前端的AJAX查询来检查。我建议构建一个快速的AJAX查询,也是因为,ChatMessage的创建涉及到一个session_key,它只能在首先发出请求时才能找到。