我是单元测试的新手,尤其是在Dart / Mockito中,因此我可能会遇到所有错误。我有一个具有registerPreLogoutCallback(PreLogoutCallback callback)
方法的身份验证系统,该方法将给定的异步回调添加到列表中。调用logOut
时,我使用Future.wait
等待这些回调中的每一个都执行完毕,然后将用户实际注销。
在测试logOut
方法时,我想确保已调用任何注册的回调。因此,我认为我应该在单元测试中几次调用registerPreLogoutCallback
,并以某种方式验证已调用了已注册的回调。这可能吗?是否违反了单元测试的目的?
最佳答案
如果logOut
定义的一部分是调用PreLogoutCallback
,则这是logOut
单元测试的一部分。可以将registerPreLogoutCallback
用作测试的一部分,但是您不测试registerPreLogoutCallback
。而是registerPreLogoutCallback
获得了自己的单元测试。logOut
的单元测试将包括类似这种模糊的Javascript伪代码的内容。
// 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()
。
关于unit-testing - 如何测试一个功能正在调用另一个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59944581/