代码之家  ›  专栏  ›  技术社区  ›  Thomas

如何反复调用一个函数直到满足一个mock?

  •  0
  • Thomas  · 技术社区  · 6 年前

    processEvents 处理事件

    function myCallback(void *userData) {
      // ...
    }
    
    int main() {
      setCallback(&myCallback, NULL);
      requestCallback();
      while (true) {
        processEvents(); /* Eventually calls myCallback, but not immediately. */
        doSomeOtherStuff();
      }
    }
    

    现在我想用googletest和googlemock测试回调是否被调用。

    我用过 MockFunction<void()> 截获实际回调;这是由一个C风格的静态函数调用的,该函数将 void *userData MockFunction<void()> * 并称之为。这个很好用。

    问题是:回调不一定发生在 第一 召唤 ; 我只知道会发生这种事 最后 如果我们继续打电话 在一个循环中。

    所以我想我需要这样的东西:

    while (!testing::Mock::AllExpectationsSatisfied() && !timedOut()) {
      processEvents();
    }
    

    但这是虚构的 AllExpectationsSatisfied 似乎不存在。我能找到的最接近的就是 VerifyAndClearExpectations ,但如果第一次尝试时没有达到预期,则会立即导致测试失败(并清除它们,以启动)。

    当然,我让这个循环运行一整秒钟左右,这会使测试变绿,但也会使它不必要的慢。

    有人知道更好的解决办法吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Petr Mánek    6 年前

    std::condition_variable . 在下一个事件到来之前,您的实现需要 while 纺纱 耗尽CPU资源,什么都没做。

    the docs .

    std::future std::promise ,它基本上封装了等待异步出现的模式。查找更多详细信息 here .

        2
  •  -1
  •   Thomas    6 年前

    MockFunction<void()> myMockFunction;
    
    // Machinery to wire callback to invoke myMockFunction...
    
    Semaphore semaphore; // Implementation from https://stackoverflow.com/a/4793662/14637
    EXPECT_CALL(myMockFunction, Call())
        .WillRepeatedly(Invoke(&semaphore, &Semaphore::notify));
    do {
      processEvents();
    } while (semaphore.try_wait());
    

    std::condition_variable 因为(1)虚假的唤醒和(2)它可以在我期望多次回调调用的情况下使用。)

    当然,这仍然需要一个总的超时,这样失败的测试就不会永远挂起。还可以将可选超时添加到 try_wait()