單元測試應測試功能並嘗試對實現細節不知情。 Mock.assert_called_with()
是一個方便的功能,但它比較*args
到*args
和**kwargs
到**kwargs
。因此:使Mock.assert_called_with()與args vs kwargs無關
# class to be mocked during test
class SomeClass():
def func(self,a,b,c=5):
# ...
# code under test
somaclass_instance.func(1,b=2,c=3)
# test code that works
someclass_mock.func.assert_called_with(1,b=2,c=3)
# test code that won't work
someclass_mock.func.assert_called_with(1,2,c=3)
someclass_mock.func.assert_called_with(a=1,b=2,c=3)
有沒有辦法讓這*args
的地方爲**kwargs
在調用func
,這實在是一個實現細節所用的具體內容,將被忽略概括呢?
我不是100%肯定我明白你的問題,但你可以通過*指定參數和** kwargs在同一個函數調用,或者,由於ARG遊戲類型元組和kwargs是類型的字典,你可能會能夠編寫一個封裝函數,將輸入規範化爲一個你確定可以工作的函數。 – 2012-02-05 21:20:28
現在是否有任何模擬框架這樣做?我的測試不應該因爲有人決定在某個時候將位置參數改變爲關鍵字參數而失敗。但是,這個問題是我見過這個問題的唯一一次。模擬已經支持規範對象,所以這應該是可能的? – jan 2015-02-20 15:23:56