需要在Django中模拟非测试方法

时间:2016-10-05 06:55:11

标签: python django unit-testing celery django-celery

我有一个测试类,如下所示:

@mock.patch('myapp.apps.mytask1.views.image_processing.apply_async')
class SortAPITestCase(APITestCase):


    def hit_scan("""some args"""):
        scan_uri = 'some url'
        data = 'some data'
        resp = self.client.post(scan_uri, data=data)
        id = resp.data['id']
        self.assertEqual(resp.status_code, 201)
        return data, id

    def setUp(self):
        super(SortAPITestCase, self).setUp()
        self.scan_data, self.id = self.hit_scan()

    def test_1(self, mock_obj):
        .....

    def test_2(self, mock_obj):
        .....

myapp.apps.mytask1.views中,有一个Scan API,其中有post方法调用芹菜任务,如:

def post("""some args"""):
    """ here there is a celery task that gets called"""
    image_processing.apply_async(
        args=[img_data], queue='image', countdown=10
    )

芹菜任务在调用时会打印出一条消息,如下面的

@shared_task
def image_processing(img_data):
    if os.isfile(img_file):
        print "File Not Present"

因此,只要img_file不存在,它就会打印出File Not Present。当测试功能(使用模拟)发布到Scan API时,由于模拟,此打印消息不会打印在控制台上。但是当发布到Scan API时hit_scan()方法,然后这条消息被打印,因为芹菜任务没有被嘲笑。我可以在hit_scan ??

中模仿芹菜任务吗?

那么,当我运行测试时,有没有办法阻止print语句出现在控制台中?

顺便说一下,所有测试用例都通过了。从这个角度来看没有问题。我只是希望控制台看起来更好,仅使用....而不是芹菜任务的打印语句也显示出来。

修改:解决了问题。这就是我做的事情

@mock.patch('myapp.apps.mytask1.views.image_processing.apply_async')
def hit_scan(self, mock_obj, """some args"""):

1 个答案:

答案 0 :(得分:0)

这与测试之外的方法无关; Python没有这样的区别。但是你的模拟语法是错误的:你需要通过Python模块路径而不是文件路径引用你想要模拟的东西。

 @mock.patch('path.something.file.apply_async')