コールバック関数が呼ばれたかのテスト

いつでも使える方法ではないですが、コールバック関数で値を書き換え、書き換わったかどうかを判定する、というのがよく使う方法です。


以下は、Boost.Asioのio_serviceを使用した例。

#include <boost/detail/lightweight_test.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
 
namespace asio = boost::asio;
 
void f(int& x)
{
    x = 2; // 2. 書き換える
}
 
int main()
{
    int x = 1; // 1. 元々の値
 
    asio::io_service io_service;
    io_service.post(boost::bind(f, boost::ref(x)));
 
    io_service.run(); // 3. コールバック関数が呼ばれる
 
    BOOST_TEST(x == 2); // 4. 書き換わってる?
 
    return boost::report_errors();
}

コールバック関数の呼ばれるタイミングが制御できないと難しいかもしれませんが、たいていのケースではイベントを一段ラップして着火タイミングを制御できる形にしてしまえばテストできます。
(たとえば、iOS SDKのタッチイベントはユーザー制御できないが、ラップすることで擬似的な指を表現でき、testableにできる)