2016-10-20 60 views
1

我有一個包裝Asio的類。它旨在模擬通過域和TCP套接字進行通信,但是我對自動執行單元測試不知所措。我查看了FakeIt,但它僅測試虛擬方法,GoogleMocks suggests模板化了我的代碼,因此我可以通過單元測試的MockAsio實現和生產中的真實Asio。如何單元測試一段依賴於Asio的代碼?

是否有任何其他方式單元測試網絡代碼?假的域和TCP套接字,而不是運行整個堆棧?如果我使用GoogleMock,爲什麼要使用一個使用GoogleMock的類而不是我自己的實現來執行我需要的任何操作?

+1

好吧,如果你依賴ASIO,那麼你不再測試這個小「單元」。單元測試框架變得越來越難作爲測試非單元測試的工具 – Hayt

+0

我想嘲笑asio的輸出,所以我可以專注於單元。 – ruipacheco

+0

我經常嘲笑I/O對象或它們的I/O服務,以便對應用程序協議進行單元測試(請參見官方的[定製服務示例](http://www.boost.org/doc/libs/1_59_0/doc/html/ boost_asio /示例/ cpp03_examples.html#boost_asio.examples.cpp03_examples.services))。在測試定時器時,還可以定製TimeTrait(請參閱[這裏](http://blog.think-async.com/2007/08/time-travel.html))。對於測試I/O,我經常發現更多值寫入離散的[mcve]集合,允許系統調用發生,這可以通過嘲弄I/O對象來掩蓋操作系統行爲 –

回答

-1

我假設你想嘲笑你的應用程序使用的ASIO包裝類。如果我的假設是正確的,那麼說包裝有一個接口(簡單化了 - 但大多數模擬框架都需要一個純抽象包括gmock) -

class Iasio 
    { 
     virtual ~Iasio() 
     { 

     } 
     virtual void send(std::vector<unsigned char> dataToSend) = 0; 
     virtual std::vector<unsigned char > rcv() = 0; 
    }; 

然後,你必須用諷刺的框架,並在兩個選項 - 1)模擬您的單元測試使用模擬(將模擬注入使用構造函數或訪問器注入的類中)。對於每個單元測試場景,您需要設置模擬對象以返回您的預期數據。

2)第一個選項有時可能比編寫你自己的測試模擬更麻煩,在這種情況下,編寫自己的測試模擬器給你更多的控制是完全可以接受的。我說更多的控制,因爲模擬框架是通用的,他們可以在大多數常見場景中提供幫助,但是複雜的場景可以要求定製測試虛擬/模擬。

+0

>我假設你想嘲笑你的應用程序使用的ASIO包裝類。 我想模擬asio所以我可以測試我的包裝類。 – ruipacheco

+0

找到了你。首先,asio庫api是什麼樣的,我們在說boost :: asio?其次我想如果你正在爲重構(包裝類的)重構,那麼你應該像在我的答案中使用類似於外觀模式的東西,在簡化的接口後面抽象出asio api。這個子彈可以幫你節省頭痛!嘲笑對於簡單的純抽象接口來說是一塊蛋糕。 – NiladriBose

+0

但是,這將需要我編輯Asio的代碼,使方法虛擬,我不能。 – ruipacheco

相關問題