2014-07-15 122 views
0

我正在爲第三方代碼做一個PHPUnit測試,它執行fgets()命令並等待輸入,這基本上阻止了我的單元測試。有沒有人有關於如何從單元測試向fgets()傳遞數據的建議?單元測試fgets()的PHP代碼

例如緣故,我想要做的是這樣的:

<?php 
$myinput = "GO SOUTH\n"; 
magicallyQueueIntoSTDINBuffer($myinput); 
assertTrue($game->listen() === "You enter the cave"); // Right now, this halts everything. 
?> 

上述假設$遊戲 - >聽()監聽STDIN,聽到「南下」,並返回「你進入洞穴「

真正的代碼是更復雜的,但上面把本質放入上下文中。

+3

這是一個依賴注入抽象一個很好的案例。不是直接在代碼中調用'fgets',而是將一個將該函數包裝到'$ game'構造函數中的對象。這個對象可以在單元測試中被模擬。 – deceze

+1

我同意,但不幸的是我使用第三方代碼。 (PHPAGI for asterisk,確切地說)它在庫中有fgets()硬編碼。我可以破解它,但是當代碼改變時我不得不重新實現破解,或者凍結我的版本。只是看看是否有其他選擇。 – Anthony

回答

1

我的建議是將電話fgets轉移到它自己的方法中(以便它是該方法中唯一的代碼行)。通過這種方式,您可以正常測試所有其他代碼。

爲了測試實際撥打fgets,我建議查看PHP的overide_functionrename_function功能。 This article也是一個很好的閱讀。引用該文章涉及的步驟:

但是,當您去恢復函數,事實證明,不 工作。你實際需要做的是:

  1. 使用rename_function命名爲舊的原始函數,所以我們可以稍後找到它。

  2. 使用override_function來定義新的行爲

  3. 使用rename_function給一個虛擬的名字__overridden__

+0

我實際上正在嘗試這樣做,但一直無法安裝APD。這似乎是最好的選擇 - 如果我可以安裝darn功能。 – Anthony

+0

你使用pear或pecl來安裝它嗎? Windows或Mac或Linux? –

+0

我在另一篇文章中發佈了問題:http://stackoverflow.com/questions/24612979/trouble-installing-pecl-apd-on-ubuntu/24690411?noredirect=1#comment38418493_24690411顯然,修復程序需要做更多的修補比我'很舒服。我還必須將此代碼添加到多個框中,因此我不希望每個框都使安裝更加複雜。 – Anthony