如何测试一个功能正在调用另一个功能?

时间:2020-01-28 08:17:15

标签: unit-testing flutter dart mockito

我是单元测试的新手,尤其是在Dart / Mockito中,因此我可能会遇到所有错误。我有一个具有registerPreLogoutCallback(PreLogoutCallback callback)方法的身份验证系统,该方法将给定的异步回调添加到列表中。调用logOut时,我使用Future.wait等待这些回调中的每一个都执行完毕,然后将用户实际注销。

在测试logOut方法时,我想确保已调用任何已注册的回调。因此,我认为我应该在单元测试中多次调用registerPreLogoutCallback,并以某种方式验证已调用注册的回调。这可能吗?是否违反了单元测试的目的?

1 个答案:

答案 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()