我是单元测试的新手,尤其是在Dart / Mockito中,因此我可能会遇到所有错误。我有一个具有registerPreLogoutCallback(PreLogoutCallback callback)
方法的身份验证系统,该方法将给定的异步回调添加到列表中。调用logOut
时,我使用Future.wait
等待这些回调中的每一个都执行完毕,然后将用户实际注销。
在测试logOut
方法时,我想确保已调用任何已注册的回调。因此,我认为我应该在单元测试中多次调用registerPreLogoutCallback
,并以某种方式验证已调用注册的回调。这可能吗?是否违反了单元测试的目的?
答案 0 :(得分:2)
如果logOut
定义的一部分是调用PreLogoutCallback
,则这是logOut
单元测试的一部分。在测试中使用registerPreLogoutCallback
是很好的选择,但是您不是在测试registerPreLogoutCallback
。相反,registerPreLogoutCallback
拥有自己的单元测试。
logOut
的单元测试中将包含类似这种模糊的Java风格的伪代码。
// Set the callback to be a closure around `preLogoutCalled`.
// registerPreLogoutCalled() has its own unit test, we know it works.
var preLogoutCalled = false
registerPreLogoutCallback( function() { preLogoutCalled = true } )
// Logout
logOut()
// Check the callback was called
assert(preLogoutCalled)
如果logOut
负责将参数传递给回调,则可以在回调本身中进行测试,以检查回调是否获得正确的参数。假设回调获取了当前用户。
logged_in_user = ...
registerPreLogoutCallback(
function(user) { assertEq(user, logged_in_user) }
)
logOut()
最好的部分是完全black-box。调用回调是logOut
定义的行为的一部分。无需假设如何实现logOut()
。