2012-09-14 32 views
6

Tôi đã tự hỏi phương pháp nào (nếu có) được sử dụng để thử nghiệm các ứng dụng Haskell có yêu cầu trên mạng không? Đến từ vùng đất của Ruby, tôi đã tìm kiếm bất kỳ thứ gì có thể khai thác hoặc "mô phỏng" các cuộc gọi mạng cho mục đích thử nghiệm các chức năng của Haskell. Tôi đặc biệt quan tâm đến giải pháp "giống VCR" (ví dụ: https://github.com/myronmarston/vcr), vì nó có vẻ là tùy chọn khả thi nhất, IMHO.Haskell: Kiểm tra các API web

Vì vậy, tôi muốn có thể ghi lại các cặp yêu cầu/phản hồi mạng một lần và sau đó sử dụng lại các bản ghi này cho các bài kiểm tra tiếp theo. Tôi đã đưa ra pha chế đơn giản của riêng tôi mà bắt đầu một máy chủ web (warp) trước khi các bài kiểm tra, phục vụ trả lời prerecorded, nhưng tôi phải trỏ tất cả các URL trong ứng dụng để "localhost". Tôi đoán, điều này không phải lúc nào cũng có thể thay thế tất cả các URL trong ứng dụng. Mặc dù tôi khá hài lòng với thiết lập của riêng tôi được mô tả ở trên (và muốn thực hiện một công cụ kiểm tra chuyên dụng/khung "plugin" từ nó sau này), nhưng tôi không muốn phát minh lại bánh xe.

+0

Tôi đã bắt đầu một dự án Haskell dựa trên ý tưởng của VCR. Đóng góp hoặc gửi phản hồi, nếu bạn sẽ: https://github.com/cordawyn/havcr –

Trả lời

3

Khám phá Control.Proxy.Tutorial. Nếu bạn có thể viết một wrapper Proxy xung quanh kiểu của bạn, sau đó bạn có thể dễ dàng trao đổi trên giao diện thử nghiệm và một giao diện thực như thế này:

client <-< simulatedServer 

client <-< realServer 

Edit: Để trả lời câu hỏi của bạn trong các bình luận, bạn sử dụng một Server viết một wrapper xung quanh simpleHTTP yêu cầu của bạn:

realServer 
:: HStream ty => Request ty -> Server (Request ty) (Result (Response ty)) IO r 
realServer = foreverK $ \req -> do 
    result <- lift $ simpleHTTP req 
    respond result 

Các máy chủ mô phỏng sẽ như thế nào:

simulatedServer 
:: (Monad m, HStream ty) 
=> Request ty -> Server (Request ty) (Result (Response ty)) m r 
simulatedServer = foreverK $ \req -> do 
    result <- lift $ simulatedRequest req 
    respond result 

Và khách hàng của bạn sẽ trông Lik e:

client 
:: (Monad m, HStream ty) =>() -> Client (Request ty) (Result (Response ty)) m r 
client() = forever $ do 
    let req = <something> 
    result <- request req 
    lift $ doSomethingWith result 

Sau đó, bạn có thể kiểm tra các máy chủ thực và máy chủ giả mạo sử dụng:

-- Test the real server 
main = runSession $ client <-< realServer 

-- Test the fake server 
main = runSession $ client <-< simulatedServer 

Các clientsimulatedServer là đa hình trong đơn nguyên cơ sở chỉ vì tôi không biết những gì cơ sở đơn nguyên họ sẽ sử dụng cho thử nghiệm của bạn. Yêu cầu duy nhất là hai thứ bạn soạn có cùng một đơn nguyên cơ sở hoặc ít nhất một là đa hình trong đơn nguyên cơ bản.

+0

Vì vậy, về cơ bản, hiện tại 'Network.HTTP.simpleHTTP req' của tôi trở thành' Control.Proxy.request req' ở phía máy khách, sau đó Tôi đang đặt 'Control.Proxy.respond $ Network.HTTP.simpleHTTP req' cho" realServer "và' Control.Proxy.respond $ Simulated.Network req' cho "simulatedServer". Sau đó, tôi chuỗi chúng như được hiển thị ở trên. Điều đó có đúng không? –

+0

@SlavaKravchenko Có. Tôi đã chỉnh sửa câu trả lời của mình để cung cấp cho bạn các ví dụ về mã cụ thể về cách thực hiện việc này ngay bây giờ mà tôi biết chính xác những gì bạn có trong đầu. –

+0

Tuyệt vời! Cảm ơn bạn rất nhiều vì sự giúp đỡ! –

Các vấn đề liên quan