diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,9 +5,8 @@
 
 ## TODO
 
-- Support non-TLS connection via an HTTP proxy server (I have to modify the [websockets](https://hackage.haskell.org/package/websockets) package to do that).
+- Support non-TLS connection via an HTTP proxy server (I have to add one more API to http-client to check if the connection is proxied package to do that).
 - Add APIs to modify config of both http-client and websockets.
-- Test with a mock server.
 
 ## Example
 
diff --git a/src/Network/WebSockets/Client.hs b/src/Network/WebSockets/Client.hs
--- a/src/Network/WebSockets/Client.hs
+++ b/src/Network/WebSockets/Client.hs
@@ -41,15 +41,15 @@
   ) where
 
 
-import qualified Control.Exception as E
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Lazy as BSL
-import qualified Network.HTTP.Client as Http
+import qualified Control.Exception            as E
+import qualified Data.ByteString              as BS
+import qualified Data.ByteString.Lazy         as BSL
+import qualified Network.HTTP.Client          as Http
 import qualified Network.HTTP.Client.Internal as Http
-import           Network.HTTP.Client.TLS (tlsManagerSettings)
-import qualified Network.WebSockets as WS
-import qualified Network.WebSockets.Stream as WS
-import           Network.URI (parseURI, URI(..), URIAuth(..))
+import           Network.HTTP.Client.TLS      (tlsManagerSettings)
+import           Network.URI                  (URI (..), URIAuth (..), parseURI)
+import qualified Network.WebSockets           as WS
+import qualified Network.WebSockets.Stream    as WS
 
 -- | The main entrypoint to connect by the WebSocket protocol.
 --   This function automatically closes the created connection
@@ -73,9 +73,9 @@
 withConnectionFromManager
   :: Http.Manager -> String -> (WS.Connection -> IO a) -> IO a
 withConnectionFromManager man rawUrl action = do
-  (isSecure, host, path) <- parseWsUrl rawUrl
+  (isSecure, host, port, path) <- parseWsUrl rawUrl
 
-  let httpUrl = (if isSecure then "https://" else "http://") ++ host ++ path
+  let httpUrl = (if isSecure then "https://" else "http://") ++ host ++ port ++ path
   req <- Http.parseRequest $ "GET " ++ httpUrl
 
   Http.withConnection req man $ \httpConn -> do
@@ -101,7 +101,7 @@
       )
 
 
-parseWsUrl :: String -> IO (Bool, String, String)
+parseWsUrl :: String -> IO (Bool, String, String, String)
 parseWsUrl raw = do
   uri  <- noteInvalidUrl "Invalid URL given" $ parseURI raw
   auth <- noteInvalidUrl "No authroity specified" $ uriAuthority uri
@@ -111,7 +111,7 @@
       scheme   = if null scheme' then wss else scheme'
       isSecure = scheme == wss
       path     = uriPath uri ++ uriQuery uri ++ uriFragment uri
-  return (isSecure, host, if null path then "/" else path)
+  return (isSecure, host, uriPort auth, if null path then "/" else path)
  where
   noteInvalidUrl :: String -> Maybe a -> IO a
   noteInvalidUrl msg =
diff --git a/test/Network/WebSockets/ClientSpec.hs b/test/Network/WebSockets/ClientSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Network/WebSockets/ClientSpec.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Network.WebSockets.ClientSpec
+  ( main
+  , spec
+  ) where
+
+
+import           Control.Applicative        (empty, (<|>))
+import qualified Data.ByteString.Lazy.Char8 as BS
+import qualified Data.Text                  as T
+import qualified Network.WebSockets.Skews   as Skews
+import           System.Envy                (FromEnv, decodeEnv, env, fromEnv)
+import           Test.Hspec
+import           Text.Read                  (readMaybe)
+
+import qualified Network.WebSockets.Client as WS
+
+
+-- `main` is here so that this module can be run from GHCi on its own.  It is
+-- not needed for automatic spec discovery.
+main :: IO ()
+main = hspec spec
+
+
+newtype PortNumber = PortNumber Int deriving (Eq, Show)
+
+instance FromEnv PortNumber where
+  fromEnv = do
+    mpn <- (readMaybe <$> env "WSS_CLIENT_TEST_SERVER_PORT") <|> pure (Just 8614)
+    PortNumber <$> maybe empty pure mpn
+
+
+spec :: Spec
+spec = describe "withConnection" $ do
+  Right (PortNumber pn) <- runIO decodeEnv
+
+  let host = "localhost"
+  server <- runIO $ Skews.start $ Skews.Args host pn
+
+  let withConnection = WS.withConnection ("ws://" ++ host ++ ":" ++ show pn)
+      payload = "response"
+      response = WS.DataMessage False False False (WS.Binary payload)
+      beforeAction = do
+        Skews.reinit server
+        Skews.setDefaultResponse server payload
+
+  before_ beforeAction $
+    it "can send and receive messages via the connection" $ do
+      actualResponse <- withConnection $ \conn -> do
+        WS.sendTextData conn ("client data" :: T.Text)
+        r <- WS.receive conn
+        WS.sendClose conn ("Bye" :: BS.ByteString)
+        return r
+      actualResponse `shouldBe` response
diff --git a/wss-client.cabal b/wss-client.cabal
--- a/wss-client.cabal
+++ b/wss-client.cabal
@@ -1,5 +1,5 @@
 name:                wss-client
-version:             0.2.0.0
+version:             0.2.1.0
 synopsis:            A-little-higher-level WebSocket client.
 description:         A-little-higher-level WebSocket client. Based on http-client and http-client-tls.
 homepage:            https://github.com/iij-ii/wss-client
@@ -46,10 +46,14 @@
   type:                exitcode-stdio-1.0
   hs-source-dirs:      test
   main-is:             Spec.hs
+  other-modules:       Network.WebSockets.ClientSpec
   build-depends:       base
                      , wss-client
+                     , bytestring
+                     , envy
                      , hspec
-                     , QuickCheck
+                     , skews
+                     , text
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
 
