django-mptt : . move_to 在测试运行器中不起作用

标签 django unit-testing move mptt

.move_to() 方法对我不起作用。我看过其他人建议保存实例以及重新加载节点实例的帖子。但这些解决方案都不适用于此测试用例。我也尝试过 ._tree_manager.rebuild(),它也不起作用。我的测试代码如下:

def test_reorder_pages(self):
    p = Page.objects.get(slug='page-1')
    p2 = Page.objects.get(slug='page-2')

    self.assertEqual(1, p.lft)
    self.assertEqual(3, p2.lft)

    p2.move_to(p, 'left')

    p = Page.objects.get(slug='page-1')
    p2 = Page.objects.get(slug='page-2')

    ## Values should now be reversed
    self.assertEqual(3, p.lft)
    self.assertEqual(1, p2.lft)

基本上,我希望发生的是第 2 页位于第 1 页“之前”(在...的左侧)。但是最后两个断言失败了。我还检查了所有其他值(lft、rght、level、tree_id),没有发生变化。

有人知道我做错了什么吗?

编辑: 根据 mossplix 的建议,我再次尝试了 Page.tree.rebuild() 。这仍然不起作用,但我确实注意到了一个奇怪的行为。 在 move_to() 之前,这些测试将通过:

    self.assertEqual(0, p.level)
    self.assertEqual(1, p.lft)
    self.assertEqual(2, p.rght)
    self.assertEqual(1, p.tree_id)

    self.assertEqual(0, p2.level)
    self.assertEqual(3, p2.lft)
    self.assertEqual(4, p2.rght)
    self.assertEqual(1, p.tree_id)

move_to()rebuild() 之后我期待的是:

    self.assertEqual(0, np.level)
    self.assertEqual(3, np.lft)
    self.assertEqual(4, np.rght)
    self.assertEqual(1, p.tree_id)

    self.assertEqual(0, np2.level)
    self.assertEqual(1, np2.lft)
    self.assertEqual(2, np2.rght)
    self.assertEqual(1, p.tree_id)

但是上面的测试失败了,仔细检查后,现在两个页面的所有这些属性(lft、rght、level、tree_id)都具有相同的值。这肯定是错误的,因为这意味着它们在树中占据完全相同的位置?

最新更新: 似乎使用 runserver,这些 Action 完美无缺。我遇到的问题似乎与测试框架有关。我尝试使用 TransactionTestCase 但这也没有解决问题。更新标题以反射(reflect)它与测试相关。

最佳答案

您可能需要显式调用

Page.tree.rebuild()
move 节点后

关于django-mptt : . move_to 在测试运行器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10270749/

相关文章:

python - 为什么coverage.py 不能正确测量Django 的runserver 命令?

c# - 单元测试验证规则

unit-testing - Grails-Spock : while projecting values in query id doesn't exist

javascript - 在 Three.js 中的下一帧之前清除屏幕?

search - 批处理文件为: move files into a sub folder if they contain the filename of another file

Red Hat 上的 Python 和 Postgres

javascript - 如何检查我有一个新的数据库条目并在通知栏中显示警报

python - 如何在使用 for 循环时仅打印 'date received' 一次?

Python 正则表达式单元测试

c++ - 双符号返回类型是什么意思?