根据有关测试的Django文档,该--keepdb标志将保留测试数据库以供将来运行.
https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---keepdb
为了清楚起见,测试(即:)的数据库是否object.save()会自动重置?或者这些变化是否需要在测试中反过来?
我正在使用python 3.5和Django 1.10并试图在tests.py中测试我的应用程序,但是出现了一个错误,它说:ValueError: Cannot assign "1": "NewsLetter.UserID" must be a "User" instance.那么如何在这里测试一个fk值?这是代码:
class NewsletterModelTest(TestCase):
@classmethod
def setUpTestData(cls):
#Set up non-modified objects used by all test methods
NewsLetter.objects.create(NewsLetterID=1, Email='test@test.com', Connected=False,UserID=1)
class NewsLetter(models.Model):
NewsLetterID = models.AutoField(primary_key=True)
Email = models.CharField(max_length=255)
Connected = models.BooleanField(default=False)
UserID = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
db_table = 'NewsLetter'
Run Code Online (Sandbox Code Playgroud) 我的 Django 应用程序中有一个路由规则,用于重定向到外部 CDN 的下载。我现在正在为我的应用程序编写测试,我想测试该路由是否成功重定向到我的 Django 设置中配置的 url。这是一个简化的示例,应该有助于解释我想要做的事情:
from django.test import SimpleTestCase
from django.test.client import Client
from django.conf import settings
class MyTestCase(SimpleTestCase):
def setUp(self):
self.client = Client()
def test_download(self):
response = self.client.get('/download/mac/')
self.assertRedirects(response, settings.URLS.get('mac'))
Run Code Online (Sandbox Code Playgroud)
现在这不起作用,即使当我在此方法中打印 settings.DOWNLOAD_URL 时,重定向也会收到 404 错误,并且复制/粘贴到浏览器中证明它有效。我开始研究为什么它不起作用,我在 Django 源代码中注意到了这一点:
请注意,assertRedirects 不适用于外部链接,因为它使用 TestClient 来执行请求。
那么,如何测试这些重定向呢?我并不是在寻找任何超级花哨的东西,我期望检查的是响应的 status_code 和位置。我看到响应有一个跟随参数,并尝试了类似的操作,但它仍然不起作用:
def test_download(self):
response = self.client.get('/download/mac/', follow=True)
self.assertEqual(response.status_code, 302)
self.assertEqual(response['Location'], settings.URLS.get('mac')
Run Code Online (Sandbox Code Playgroud)
有人要求我包含 urls.py 和views.py 中的相关部分,它们是:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('myapp.views',
url(r'^download/(?P<platform>\w+)/$', 'download_app', name='download'),
)
#views.py
from django.conf import …Run Code Online (Sandbox Code Playgroud) 我使用django 1.8我有一个模型参考django.contrib.contenttypes.ContentType:
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class TaggedItem(models.Model):
tag = models.SlugField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
def __str__(self): # __unicode__ on Python 2
return self.tag
Run Code Online (Sandbox Code Playgroud)
我有一个tests.py:
class TestObj(models.Model):
value = models.IntegerField(default=42, null=False)
def __str__(self):
text = "%s-%i" % ("name", self.value)
return text
class MyUnitTest(TestCase):
def setUp(self):
TestObj.objects.create(value=40)
TestObj.objects.create()
def test_my_test(self):
obj1 = TestObj.objects.get(value=40)
obj2 = TestObj.objects.get(value=42)
self.assertEqual(obj1.value, 40)
self.assertEqual(obj2.value, 42)
Run Code Online (Sandbox Code Playgroud)
当我尝试在没有迁移的情况下创建数据库(以及"测试")时,我收到一个带有无效引用的错误:
./manage.py syncdb
...
django.db.utils.ProgrammingError: ERROR: reference …Run Code Online (Sandbox Code Playgroud) 我有一个我喜欢测试的视图方法.我正在为数据提供self.client.get方法,但无法验证表单.我究竟做错了什么?
using django 1.8
python 3.5
Run Code Online (Sandbox Code Playgroud)
这是视图方法
def saveNewDriverInfo(request):
if request.user.is_authenticated():
form = DriverForm(request.POST)
if form.is_valid():
new_Driver = form.save()
carid = form.cleaned_data['carID']
Car = get_object_or_404(Car, pk=carid)
return redirect('carmanager:carDetails', carID=carid
else:
return HttpResponse("something went wong some where! yes i said wong!")
Run Code Online (Sandbox Code Playgroud)
这是测试方法
def test_saveNewDriverInfo(self):
self.client.login(username="testuser",password="testuser321")
response= self.client.get(reverse('carmanager:saveNewDriverInfo'),data={'form':{'carID':'1034567','Driver_Last_Name':'daddy','Driver_First_Name':'daddy','Driver_Middle_Initial':'K','entered_by':'king'}})
#self.assertRedirects(response, expected_url, status_code, target_status_code, host, msg_prefix, fetch_redirect_response)
self.assertNotContains(response, 'something went wrong' ,200)
Run Code Online (Sandbox Code Playgroud)
还要注意这个测试工作,因为它得到的反应是我得到的.但评论的行是我想要使用的
但我似乎无法将信息提供给DriverForm.任何帮助将不胜感激
使用覆盖率来查看需要测试的内容,覆盖率显示接下来必须进行测试:
send_alert.apply_async()
我知道这是芹菜任务,但是有什么方法可以测试代码行吗?
其余代码用于理解测试逻辑:
class SomeView(GenericAPIView)
def post(self, request, *args, **kwargs):
#some code
if not value:
send_alert.apply_async()
# response
# not if Response
Run Code Online (Sandbox Code Playgroud)
由于第一个答案而编写的测试
@patch('event.views.send_alert')
def test_send_alert(self, mock_send):
data = {some data for post}
response = self.client.post('/api/{0}/mettings/'.format(self.user), data)
print(response.json())
self.assertTrue(mock_send.called)
Run Code Online (Sandbox Code Playgroud)
我还检查了任务完成后的情况,print('Tasks Passed')我看到任务已通过的消息,但测试失败并出现错误AssertionError: False is not true
首先,我是在这里提问的新手,所以如果我做得不完美,请耐心等待:) 这是...
我正在设置一个处理统计信息的 Django2.0 API。它显然有自己的“默认”数据库来写东西,但我将需要其他几个只读的数据库。这就是现在的设置。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dev_gpws',
'USER': 'dev_gpws_user',
'PASSWORD': 'gpws_pwd',
'HOST': 'localhost',
'PORT': '5432',
},
'other_db': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'other_db_name',
'USER': 'other_db_user',
'PASSWORD': 'other_db_pwd',
'HOST': 'other_db_host',
'PORT': '5432',
},
}
Run Code Online (Sandbox Code Playgroud)
fabric 将项目部署到 staging 时,部分例程为./manage.py test,导致如下错误:
(gpws) dev_gpws@af968cdb7653:~/gpws/project$ ./manage.py test
Creating test database for alias 'default'...
Creating test database for alias 'other_db'...
Got an error creating the test database: ERREUR: permission denied to create database
Run Code Online (Sandbox Code Playgroud)
考虑到other_db_user是只读用户,这是完全有意义的,所以我想禁用 django 对此数据库的测试。有没有干净的方法来做到这一点?此外,此统计应用程序稍后将与相当多的数据库链接,因此我宁愿使用易于扩展的解决方案。 …
这是我在下面提到的 views.py 的测试功能:
def test_operation_page(self):
url = reverse('operation')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'abc.html')
self.assertContains(response, '<b>BOOK id having certain title:</b>')
Run Code Online (Sandbox Code Playgroud)
这是我在测试视图时遇到的错误
断言错误:SimpleTestCase 子类中不允许对“默认”的数据库查询。子类化 TestCase 或 TransactionTestCase 以确保正确的测试隔离或将“默认”添加到 home.tests.TestViews.databases 以消除此故障。
这是我的views.py
def operation(request):
queryset=Mytable.objects.filter(title="The Diary of Virginia Woolf Volume Five: 1936-1941").values('bookid')
textset=list(Mytable.objects.order_by('-bookid').values('title'))
context={
'key1' : queryset,
'key2' : textset
}
return render(request,'abc.html',context)
Run Code Online (Sandbox Code Playgroud)
这是我的 urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('',v.index,name='index'),
path('abc/',v.operation,name='operation')
Run Code Online (Sandbox Code Playgroud)
]
我正在测试我的一个网页 POST 功能。if request.method == 'POST'它生成一个 pdf 并将其附加到用户。每次我运行测试时,我都会生成在我的 MEDIA 文件夹中构建的 pdf 文件,我必须手动删除它们。我决定寻找防止这种情况发生的方法,在我看来最好的方法是用临时文件覆盖我的 MEDIA_ROOT。
我收到以下错误消息
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Acer\\AppData\\Local\\Temp\\profile_pics\\default.jpg'
Run Code Online (Sandbox Code Playgroud)
我确定这是因为我必须在运行测试之前创建并登录一个用户(我不想在设置中这样做,因为我必须为不同的测试生成不同类型的用户)。每次创建用户时,他们的个人资料图片都会设置为profile_pics\\default.jpg'。
我的理解是模拟的 MEDIA_ROOT 是空的,不包含默认的配置文件图片,所以会抛出错误。
我的问题是如何绕过这个(最好是模拟 default.jpg 图像)?除了模拟 MEDIA_ROOT 文件夹之外,我还找到了其他解决方案,但它们看起来很笨拙,我更喜欢正确地执行此操作,并希望从中学习。
测试.py
from django.test import override_settings
import tempfile
@override_settings(MEDIA_ROOT=tempfile.gettempdir())
def test_redirects_after_POST(self):
user = User.objects.create_superuser('username')
self.client.force_login(user)
response = self.client.post(
reverse('final_question'), data={
'answer': 'this has me totally stumped'}
)
self.assertRedirects(response, reverse('page_2'))
Run Code Online (Sandbox Code Playgroud)
谢谢你。
我正在尝试测试非登录用户重定向到登录网址。有没有办法将获取参数(例如“next”)传递给reverse_lazy?我正在使用基于类的视图。
class SecretIndexViewTest(TestCase):
url = reverse_lazy('secret_index')
login_url = reverse_lazy('login')
client = Client()
def test_http_status_code_302(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, self.login_url,)
Run Code Online (Sandbox Code Playgroud)
上面失败了
Response redirected to '/login?next=/secret', expected '/login'Expected '/login?next=/secret' to equal '/login'.
Run Code Online (Sandbox Code Playgroud)
尝试过
class SecretIndexViewTest(TestCase):
url = reverse_lazy('secret_index')
login_url = reverse_lazy('login', kwargs={'next': url)
client = Client()
def test_http_status_code_302(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, self.login_url,)
Run Code Online (Sandbox Code Playgroud)
结果没有反向匹配
django.urls.exceptions.NoReverseMatch: Reverse for 'login' with keyword arguments '{'next': '/secret'}' not found. 1 pattern(s) tried: ['/login$']
Run Code Online (Sandbox Code Playgroud)
将 kwargs 更改为 args 将导致相同的错误。
我知道我可以用下面的方法处理它,但我正在寻找更好的解决方案。
self.assertRedirects(response, self.login_url + …Run Code Online (Sandbox Code Playgroud) django-tests ×10
django ×9
python ×5
celery ×1
django-views ×1
python-3.x ×1
selenium ×1
unit-testing ×1