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

标签 unit-testing flutter dart mockito

我是单元测试的新手,尤其是在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/

相关文章:

unit-testing - 单元测试中的NullError

python - 可以在不模拟对象的其他属性的情况下模拟 python 构造函数吗?

flutter - BannerAd事件为MobileAdEvent.failedToLoad

firebase - Cloud Firestore 不等式运算符异常抖动

java - 如何在Junit(Spring Boot)中模拟BeanPropertyRowMapper?

javascript - 如何使用 SpyOnEvent 通过 jquery-jasmine 监视事件

ios - 无法在iPhone上模拟应用程序

Flutter 找不到小部件属性 : 'child' isn't defined

firebase - 使用 Flutter ChangeNotifierProvider 进行身份验证

dart - Flutter 使用不同的 initialRoute