0

我想测试一些 django 应用程序 url。但是,关联的视图链接到数据库。我想做的是嘲笑视图方法的这些方面,但我不知道怎么做。

假设我想试试/signinurl,它是一种经典的登录形式。关联的视图如下所示:

def login(request):
    if 'user' in request.session:
        return redirect(reverse("home"))
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            return treat_login(request, username, password) # checks if couple 
                                                              is present in 
                                                              database, returns 
                                                              pages accordingly
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form':form, })

在我的测试中,我没有隐式调用该login方法,因为我只使用url

class Tests_urls(TestCase):
    def test_signin(self):
        self.client.post(reverse("login"), {"username":"login", "password":"pwd"})
        self.assert_http_status(url, status, "after a standard login")

该测试的问题是它需要执行一个数据库,这是我想要避免的(我不能使用嵌入式测试数据库)。

因此,我想知道如何treat_login从测试的角度模拟该方法。

4

1 回答 1

2

您可以使用模拟库中的补丁

from mock import patch

class Tests_urls(TestCase):
    @patch('my_app.views.treat_login')
    def test_signin(self, mock_treat_login):
        self.client.post(reverse("login"), {"username":"login", "password":"pwd"})
        self.assert_http_status(url, status, "after a standard login")
        self.assertTrue(mock_treat_login.called)

您还可以检查调用参数。但是您编写此测试的方式使这有点困难。如果您使用请求工厂并通过执行类似的操作来测试该功能

request = self.factory.post(
    reverse("login"), {"username":"login", "password":"pwd"})

response = login(request

mock_treat_login.assert_called_once_with(request, "login", "pwd)

然后,您实际上可以确保您正确调用它。

于 2013-10-23T07:36:52.737 回答