0

私は、javascript、node.js、coffeescript、nodeunit など、スタック全体にまったく新しいブランドです。私はそれを段階的に行うべきだと思いますか?あなたはおそらく正しいですが、私はまだそれをするつもりはありません.

テストファイルは次のとおりです。

testCase = require('nodeunit').testCase

Server = require('./web').WebServer
Client = require('../lib/client').Client
Request = require('../lib/request').Request

OPTIONS = {host: 'localhost', port: 8080, path: '/', method: 'GET'}
SERVER = new Server OPTIONS.port
CLIENT = new Client
REQUEST = new Request OPTIONS
SERVER.start() # asynchronous!

module.exports = testCase
  setUp: (callback) ->
    callback()

  tearDown: (callback) ->
    callback()

  testResponseBodyIsCorrect: (test) ->
    test.expect 1
    process.nextTick ->
      CLIENT.transmit REQUEST #asynchronous!
      process.nextTick ->
        test.equal REQUEST.body, /Ooga/
        test.done()

内部的には、http ライブラリの単なるラッパーです。ノード 0.4.11 を使用しています。これは実際には機能しません。ここには 2 つの非同期呼び出しがあります。コーヒー REPL でこれを手動で行うと、動作しますが、nodeunit は私よりもはるかに高速であるため、競合状態と呼ぶ何かに遭遇します。ニヤニヤ

「送信」の実装は次のとおりです。 Http = require 'http'

exports.Client = class Client

  transmit: (request, callback = null) ->
    req = Http.request request.options, (res) ->
      res.setEncoding 'utf8'
      res.on 'data', (chunk) ->
        request.appendToResponseBody chunk
    req.end()

    console.log "Request sent!"

テストを実行する前に、サーバーがポートにバインドされていることを確認する必要があります。また、アサーションを実行する前に、応答を取得するために ".transmit" が内部コールバックを完了していることを確認する必要があります。

これを行うためのクリーンな方法 (または少なくとも機能する方法) は何ですか?

4

1 に答える 1

1

非同期処理を行う場合は、非同期関数からのコールバックに残りのコードを配置する必要があります。だから代わりに

CLIENT.transmit REQUEST process.nextTick -> ...

行う

CLIENT.transmit REQUEST、(応答) -> ...

(あなたのCLIENT.transmitメソッドは、取得した応答でコールバックを呼び出すように実装されていると想定しています。そうすべきです!)

ここで、クライアントとサーバーを同時にテストしようとしている場合は、EventEmitterSERVERを使用する必要があります。オブジェクトは Node のhttp.Serverタイプから継承されているため、既に EventEmitterであることがわかると思います。http.Serverオブジェクトrequestはリクエストを受け取るたびにイベントを発生させるため、次のようなことができます

SERVER.on 'request', (request) ->
  test.equals REQUEST.body, request.body

かなりいいですよね?ノード スタイルの非同期性は気が遠くなる可能性がありますが、驚くほど多くのオプションが用意されています。

于 2011-10-01T00:03:24.390 に答える