[OK]を、ネットワークソケットの抽象化の作成から始めましょう。システム関数への呼び出しを疑似できるようにするには、これが必要です。
class Socket {
public:
virtual bool connect(const struct sockaddr *address, socklen_t address_len) = 0;
virtual Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) = 0;
/* more functions */
}
それはsockaddr
とsocklen_t
を使用しているため、上記のコードは、UNIXのクラスにコンテンツとそのバインドの抽象多くをされていません。このような何かを起動します。また、これらの2つのタイプにプラットフォームに依存しないコードを作成する抽象化を作成する必要がありますが、これは設計によって異なります。
実際のアプリケーションで使用するための具体的なTCP/UDPクラスを作成する必要はありません。
class TCPSocket : public Socket {
public:
TCPSocket() {
socket_ = socket(PF_INET, SOCK_STREAM, 0);
if (socket_ == -1) {
/* handle errors */
}
}
TCPSocket(int sock) : socket_(sock) {}
bool connect(const struct sockaddr *address, socklen_t address_len) override {
return connect(socket_, address, address_len) == 0;
}
Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) override {
int s = accept(socket_, address, address_len);
if (s == -1) {
/* handle errors */
}
return new TCPSocket(s);
}
private:
int socket_;
}
Phew :)あなたのクラスに移動しましょう。
あなたのクラスの名前はA
とし、method
のテスト方法があるとします。 クラスはコンストラクタ内でSocket*
のいずれかを取るか、method
はパラメータとしてSocket*
を取る必要があります。次に、テストコードでモックを指定することができます。
class MockSock : public Socket {
public:
MOCK_METHOD2(connect, bool(const struct sockaddr*, socklen_t));
MOCK_METHOD2(accept, Socket*(struct sockaddr*, socklen_t*));
}
は、ちょうどMockSockをインスタンス化し、適切なEXPECT_CALL
値でA
またはmethod
に渡します。
ソケットの抽象化を作成し、それをクラスに挿入します。その後、あなたはそれを嘲笑することができます。 –
@BartoszPrzybylskiあなたは私にいくつかの例を教えてくれますか?私は駆動開発をテストするために新しいです、そして、私はどのように注射を行うことができないのか分かりません。どうもありがとう。 – Joe
TCP接続を表す抽象基本クラスを作成し、データの読み書きなどのメソッドを持ちます。その後、実動コードは実ソケットを使用してロジックを実装するクラスを派生させることができ、テストユニットはロジックを実装する別のクラス偽のデータを使用してすべての基本クラスインターフェイスを使用して残りのユニットコードを記述し、必要に応じて適切な派生クラスをインスタンス化できます。このようにして、実際のネットワーク動作をテストしていない限り、テスト中に実際のソケットを使用する必要はありません。 –