使用post_save信号在Django模型上模拟方法

UXTX

所以这是我想弄清楚的事情。我有一个针对该“故事”模型的post_save触发的方法。工作正常。我需要做的是弄清楚如何模拟测试,以便我可以伪造该调用并在我的收益上做出断言。我认为我需要以某种方式对其进行修补,但是我尝试了几种不同的方法,但没有取得太大的成功。我能得到的最好的是一个对象实例,但是它忽略了我传入的值。

我在测试中评论了我的困惑所在。任何帮助都将受到欢迎。

这是我的测试:

from django.test import TestCase
from django.test.client import Client
from marketing.blog.models import Post, Tag
from unittest.mock import patch, Mock

class BlogTestCase(TestCase):
    fixtures = [
        'auth-test.json',
        'blog-test.json',
    ]

    def setUp(self):
        self.client = Client()

    def test_list(self):
        # verify that we can load the list page
        r = self.client.get('/blog/')
        self.assertEqual(r.status_code, 200)
        self.assertContains(r, "<h1>The Latest from Our Blog</h1>")
        self.assertContains(r, '<a href="/blog/javascript-date-formatting/">Simple JavaScript Date Formatting</a>')
        self.assertContains(r, 'Page 1 of 2')

        # loading a page out of range should redirect to last page
        r = self.client.get('/blog/5/', follow=True)
        self.assertEqual(r.redirect_chain, [
            ('http://testserver/blog/2/', 302)
        ])
        self.assertContains(r, 'Page 2 of 2')

        # verify that unpublished posts are not displayed
        with patch('requests') as mock_requests:
            # my futile attempt at mocking.
            # creates <MagicMock> object but not able to call return_values
            mock_requests.post.return_value = mock_response = Mock()

            # this doesn't get to the magic mock object. Why?
            mock_response.status_code = 201

            p = Post.objects.get(id=5)
            p.published = False
            # post_save signal runs here and requests is called.
            # Needs to be mocked.
            p.save()

            r = self.client.get('/blog/')
            self.assertNotContains(r, '<a href="/blog/javascript-date-formatting/">Simple JavaScript Date Formatting</a>')

这是模型:

from django.db import models
from django.conf import settings
from django.db.models import signals
import requests

def update_console(sender, instance, raw, created, **kwargs):
    # ignoring raw so that test fixture data can load without
    # hitting this method.
    if not raw:
        update = instance

        json_obj = {
            'author': {
                'alias': 'the_dude',
                'token': 'the_dude'
            },
            'text': update.description,
        }

        headers = {'content-type': 'application/json'}

        path = 'http://testserver.com:80/content/add/'
        request = requests(path, 'POST',
            json_obj, headers=headers,
            )
        if request.status_code < 299:
            story_id = request.json().get('id')
            if story_id:
                # disconnect and reconnect signal so
                # we don't enter recursion-land
                signals.post_save.disconnect(
                    update_console,
                    sender = Story, )
                update.story_id = story_id
                update.save()
                signals.post_save.connect(
                    update_console,
                    sender = Story, )
        else:
            raise AttributeError('Error Saving to console, '+ request.text)

class Story(models.Model):
    """Lets tell a story"""
    story_id = models.CharField(
        blank=True,
        max_length=10,
        help_text="This maps to the id of the post"
    )
    slug = models.SlugField(
        unique=True,
        help_text="This is used in URL and in code references.",
    )
    description = models.TextField(
        help_text='2-3 short paragraphs about the story.',
    )

    def __str__(self):
        return self.short_headline

# add/update this record as a custom update in console
signals.post_save.connect(update_console, sender = Story)
尼古拉斯·科尔托(Nicolas Cortot)

您需要requests在实际使用的模块中打补丁,即

with patch('path.to.your.models.requests') as mock_requests:
    mock_requests.return_value.status_code = 200
    mock_requests.return_value.json.return_value = {'id': story_id'}
    ...

该文档提供了有关修补位置的更详细说明

修补程序通过(临时)将一个名称指向的对象更改为另一个对象来工作。可以有许多名称指向任何单个对象,因此,要使修补程序起作用,必须确保修补受测系统使用的名称。

基本原理是您修补查找对象的位置,该对象不一定与定义对象的位置相同。

在这里,您需要requestsmodels模块内部打补丁,因此需要提供其完整路径。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在post_save信号上以Django模型获取当前登录的用户?

来自分类Dev

Django信号post_save()

来自分类Dev

具有post_save信号的django_mptt模型

来自分类Dev

具有post_save信号的django_mptt模型

来自分类Dev

Django信号post_save更新

来自分类Dev

使用 OneToOneField 扩展 Django 的用户模型:当并非每个用户都是 CustomUser 时,适当的 post_save 信号

来自分类Dev

Viewset / Serializer上的DRF PUT不会在模型实例上触发post_save信号

来自分类Dev

Python Django 模型信号 Post_Save 查询对象不包含保存的对象

来自分类Dev

Django-在模型上模拟save方法

来自分类Dev

Django更改使用内联时调用pre_save post_save信号的顺序?

来自分类Dev

传递参数Django信号-post_save / pre_save

来自分类Dev

在post_save django上发送邮件

来自分类Dev

在post_save信号上获取完整的User对象

来自分类Dev

Django从post_save信号访问ManyToMany字段

来自分类Dev

识别Django post_save信号中已更改的字段

来自分类Dev

Django从post_save信号访问ManyToMany字段

来自分类Dev

Django:断开 post_save 信号以避免递归

来自分类Dev

多对多关系查询在post_save信号上返回空的查询集,但在Django shell中不返回

来自分类Dev

Django:将变量从pre_save传递到post_save信号

来自分类Dev

将 pre_save 信号更改为 post_save?Django

来自分类Dev

如何将Django post_save信号作为后台进程运行?

来自分类Dev

由post_save信号执行的Django代码在原子事务内发生

来自分类Dev

Django管理命令并将自定义参数发送到post_save信号

来自分类Dev

由post_save信号执行的Django代码在原子事务内发生

来自分类Dev

Django管理命令并将自定义参数发送到post_save信号

来自分类Dev

使用post_save和post_delete方法会降低所有Django项目的速度吗?

来自分类Dev

使用post_save信号或在视图中执行逻辑有什么区别

来自分类Dev

该行在post_save信号中起什么作用?

来自分类Dev

何时在Django中使用pre_save,保存,post_save?

Related 相关文章

  1. 1

    如何在post_save信号上以Django模型获取当前登录的用户?

  2. 2

    Django信号post_save()

  3. 3

    具有post_save信号的django_mptt模型

  4. 4

    具有post_save信号的django_mptt模型

  5. 5

    Django信号post_save更新

  6. 6

    使用 OneToOneField 扩展 Django 的用户模型:当并非每个用户都是 CustomUser 时,适当的 post_save 信号

  7. 7

    Viewset / Serializer上的DRF PUT不会在模型实例上触发post_save信号

  8. 8

    Python Django 模型信号 Post_Save 查询对象不包含保存的对象

  9. 9

    Django-在模型上模拟save方法

  10. 10

    Django更改使用内联时调用pre_save post_save信号的顺序?

  11. 11

    传递参数Django信号-post_save / pre_save

  12. 12

    在post_save django上发送邮件

  13. 13

    在post_save信号上获取完整的User对象

  14. 14

    Django从post_save信号访问ManyToMany字段

  15. 15

    识别Django post_save信号中已更改的字段

  16. 16

    Django从post_save信号访问ManyToMany字段

  17. 17

    Django:断开 post_save 信号以避免递归

  18. 18

    多对多关系查询在post_save信号上返回空的查询集,但在Django shell中不返回

  19. 19

    Django:将变量从pre_save传递到post_save信号

  20. 20

    将 pre_save 信号更改为 post_save?Django

  21. 21

    如何将Django post_save信号作为后台进程运行?

  22. 22

    由post_save信号执行的Django代码在原子事务内发生

  23. 23

    Django管理命令并将自定义参数发送到post_save信号

  24. 24

    由post_save信号执行的Django代码在原子事务内发生

  25. 25

    Django管理命令并将自定义参数发送到post_save信号

  26. 26

    使用post_save和post_delete方法会降低所有Django项目的速度吗?

  27. 27

    使用post_save信号或在视图中执行逻辑有什么区别

  28. 28

    该行在post_save信号中起什么作用?

  29. 29

    何时在Django中使用pre_save,保存,post_save?

热门标签

归档