假设我有以下代码:
bm.py
from a.b import AC
class B:
def __init__(self, **kwargs):
self.blah = kwargs["blah"]
def foo(self, message):
# Do something here and then finally use AC().send()
AC().send(message)
我正在为上面的代码编写以下测试用例:
import pytest
import unittest
from mock import patch
from a.b import AC
import B
class TestB(unittest.TestCase):
@patch('AC.send')
def test_foo(self, mock_send):
s = B(blah="base")
s.foo("Hi!")
## What to assert here???
我想嘲笑AC.send
。 AC.send
不返回任何东西,因为它正在“发送”到某些外部服务/机器。而且,B.foo()也不会返回任何东西。所以我不确定应该断言和检查什么?
使用上述测试用例,我得到以下错误:
ModuleNotFoundError: No module named 'AC'
我是单元测试用例和模拟的新手。
答案 0 :(得分:1)
关于
ModuleNotFoundError: No module named 'AC'
您应该在@patch中使用完整的名字-在您的情况下为 @patch('a.b.AC.send')
关于
## What to assert here???
这个问题太广泛了,取决于应用程序。通常,您需要问自己对生产代码的期望是什么。 有时您只想检查是否有例外。在这种情况下,您无需声明任何内容。如果出现异常,则测试将失败。
建议阅读这篇精美的帖子this
答案 1 :(得分:0)
您可以使用完整导入。
@patch('a.b.AC.send')
答案 2 :(得分:0)
基于@Florian Bernard在评论部分中提到的内容,以下内容有效!
import pytest
import unittest
from mock import patch
from a.b import AC
import B
class TestB(unittest.TestCase):
@patch('a.b.AC.send') ##Provide the full import
def test_foo(self, mock_send):
s = B(blah="base")
s.foo("Hi!")