Amy*_*yth 18 django compare django-queryset testcase
我有一个非常简单的观点如下
def simple_view(request):
documents = request.user.document_set.all()
return render(request, 'simple.html', {'documents': documents})
Run Code Online (Sandbox Code Playgroud)
为了在我的测试用例中测试上面的视图,我有以下方法出错.
Class SomeTestCase(TestCase):
# ...
def test_simple_view(self):
# ... some other checks
docset = self.resonse.context['documents']
self.assertTrue(self.user.document_set.all() == docset) # This line raises an error
# ...
Run Code Online (Sandbox Code Playgroud)
我得到的错误是AssertionError: False is not true.我尝试打印两个查询集,两者完全相同.False当两个对象相同时,为什么会返回?有任何想法吗 ?
目前为了克服这一点,我使用了一个讨厌长度的讨厌的黑客如下:
ds1, ds2 = self.response.context['documents'], self.user.document_set.all()
self.assertTrue(len([x for x in ds1 if x in ds2]) == len(ds1) == len(ds2)) # Makes sure each entry in ds1 exists in ds2
Run Code Online (Sandbox Code Playgroud)
Mat*_*ohn 26
如果查询集对象是不同查询的结果,则它们将不相同,即使它们在结果中具有相同的值(比较ds1.query和ds2.query).
如果首先将查询集转换为列表,则应该能够进行正常比较(假设它们具有相同的排序顺序):
self.assertEqual(list(ds1), list(ds2))
Run Code Online (Sandbox Code Playgroud)
此替代方案不需要排序:
self.assertQuerysetEqual(qs1, list(qs2), ordered=False)
Run Code Online (Sandbox Code Playgroud)
请参阅断言参考.
注意:仅适用于django 1.4+.
| 归档时间: |
|
| 查看次数: |
8504 次 |
| 最近记录: |