[英]How to test that a function is called within a function with nosetests
我正在嘗試為項目設置一些自動單元測試。 我有一些功能,作為副作用偶爾會調用另一個功能。 我想寫一個單元測試,測試第二個函數被調用,但我很難過。 下面是偽代碼示例:
def a(self):
data = self.get()
if len(data) > 3500:
self.b()
# Bunch of other magic, which is easy to test.
def b(self):
serial.write("\x00\x01\x02")
如何測試b()
gets被調用?
您可以使用模擬模塊模擬函數b
並檢查它是否被調用。 這是一個例子:
import unittest
from mock import patch
def a(n):
if n > 10:
b()
def b():
print "test"
class MyTestCase(unittest.TestCase):
@patch('__main__.b')
def test_b_called(self, mock):
a(11)
self.assertTrue(mock.called)
@patch('__main__.b')
def test_b_not_called(self, mock):
a(10)
self.assertFalse(mock.called)
if __name__ == "__main__":
unittest.main()
另見:
希望有所幫助。
這件事可能有各種解決方案。 但首先,我必須指出,單元測試是針對測試單元的; 什么單位可以是觀看事物的問題。 在你的情況下,我會說一個單位是函數a()
因為你想測試你的單位行為正確,這意味着它在正確的位置調用函數b()
。 另一種觀點是,函數a()
和b()
是一個單位。 然后,你不喜歡,檢查功能是否b()
被調用,你只是想測試的函數調用的結果, a()
因此,最好自己決定適合自己的情況。
如果你真的想要測試函數a()
作為一個單元,你應該准備你的單元進行測試。 在你的情況下,可以通過向它添加一個額外的參數(默認為函數b
),並將使用它來代替硬編碼函數b()
調用a()
:
def a(self, subfunction=None):
is subfunction is None: # for testing
subfunction = self.b
data = self.get()
if len(data) > 3500:
subfunction()
現在你可以注入(在測試期間)一個幫助函數,它只是通知測試它被調用:
store = None
def injected(*args, **kwargs):
global store
store = args, kwargs
obj.a(subfunction=injected)
# now check if global store is set properly
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.