我想测试一些django应用程序网址。但是,关联的视图链接到数据库。我想做的是嘲笑视图方法的这些方面,但我不知道如何。
让我们假设我想尝试/signin
网址,这是一种经典的登录形式。
相关视图如下所示:
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
方法。
答案 0 :(得分:2)
您可以使用mock libarary
中的补丁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)
您还可以检查调用args。但是你编写这个测试的方式让人有点困难。如果您使用request factory并通过执行类似
的操作来测试该功能request = self.factory.post(
reverse("login"), {"username":"login", "password":"pwd"})
response = login(request
mock_treat_login.assert_called_once_with(request, "login", "pwd)
然后你可以确定你正确地调用它。