【问题标题】:How can you test that a function is invoking another function?如何测试一个函数是否正在调用另一个函数?
【发布时间】:2020-05-13 14:56:11
【问题描述】:

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

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

【问题讨论】:

    标签: unit-testing flutter dart mockito


    【解决方案1】:

    如果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() 的实现方式做出任何假设。

    【讨论】:

    • Javascripty 示例正是我想要的。非常感谢您的详细回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多