簡體   English   中英

如何測試在具有nosetests的函數中調用函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM