2011-08-30 42 views
3

我正在嘗試測試異步寫入文件的日誌記錄模塊...單元測試嘗試讀取日誌以確保書面消息與預期匹配。但是,我發現模塊的異步寫入直到單元測試完成後纔會到達文件,即使我正在睡眠以等待文件達任意長度的時間。我通過在aio_close旁邊添加打印語句來驗證文件沒有被關閉。我能做些什麼來測試呢?如何等待perl中的異步文件

 #approximately the way this works: 
     aio_open($pathname, 
      $flags, 
      $mode, 
      sub 
      { 
       my $fh = shift; 
       aio_write($fh, 
          0, 
          length($log), 
          $log, 
          0, 
          sub 
          { 
           print "here"; 
           aio_close($fh, sub {}); 
          }); 
      }); 

回答

2

好了,說完了一下週圍挖,我發現我可以打電話.. 。

IO::AIO::flush; 

這會導致所有異步緩衝區在執行測試之前刷新。

+0

不錯的發現! +1 – DVK

+0

不完全。 'flush'會導致程序等待所有未完成的異步操作完成。你的情況,包括執行'aio_close',這是最終刷新你的輸出緩衝區。 – mob

1

讓您的文件編寫器接受回調「done_writing」子文件。

如果提供,請調用它。

有一個單元測試提供了一個回調,它可以創建一個觸摸文件,或者只是在單元測試中填充一個「ready」標誌。

作爲可替代的形式,有回調的問題的信號,並建立了單元測試與信號處理睡了該信號

+0

我想如果我讓它自動刷新,它會阻塞(因此不再是異步),對吧?我曾考慮修改記錄器的回調...我認爲這將工作。我最終找到了我添加的答案。 – tbischel