12

アプリケーション内で自己ホスト型の NancyFX Web サーバーを実行しています。現在、ホストされているモジュールが 1 つあります。

public class MetricsModule : NancyModule
{
    private IStorageEngine _storageEngine;

    public MetricsModule(IStorageEngine storageEngine) : base("/metrics")
    {
        _storageEngine = storageEngine;

        Get["/list"] = parameters =>
        {
            var metrics = _storageEngine.GetKnownMetrics();
            return Response.AsJson(metrics.ToArray());
        };

        Get["/query"] = parameters =>
        {
            var rawStart = parameters.start;
            var rawEnd = parameters.end;
            var metrics = parameters.metrics;

            return Response.AsJson(0);
        };
    }
}

私のブートストラップクラスは次のとおりです。

public class OverlookBootStrapper : DefaultNancyBootstrapper
{
    private readonly IStorageEngine _storageEngine;

    public OverlookBootStrapper(IStorageEngine storageEngine)
    {
        _storageEngine = storageEngine;
    }

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        container.Register(_storageEngine);
    }
}

次のテストでテストしようとしています。

    [TestInitialize]
    public void Init()
    {
        _storageEngine = new Mock<IStorageEngine>();

         var bootstrapper = new OverlookBootStrapper(_storageEngine.Object);
         _browser = new Browser(bootstrapper);
    }

    [TestMethod]
    public void Query_Builds_Correct_Query_From_Parameters()
    {
        var metric = new Metric("device", "category", "name", "suffix");
        var startDate = DateTime.Now;
        var endDate = DateTime.Now.AddMinutes(10);
        var path = "/metrics/query";

        var response = _browser.Get(path, with =>
        {
            with.HttpRequest();
            with.Query("start", startDate.ToString());
            with.Query("end", endDate.ToString());
            with.Query("metrics", metric.ToParsableString());
        });

        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Incorrect status code returned");
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.StartDate == startDate)), Times.Once());
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.EndDate == endDate)), Times.Once());
        _storageEngine.Verify(x => x.ExecuteQuery(It.Is<Query>(y => y.Metrics.Contains(metric))), Times.Once());
    }

このテストがデバッグされ、ブレークポイントが設定されたreturn Response.AsJson(0);ときに、パラメーター オブジェクトを調べたところ、それparameters.Countがゼロであり、3 つの値がすべて null であることがわかりました。

私は間違って何をしていますか?

編集: Web ブラウザーでこのエンドポイントを表示すると、同じ問題が発生します。ブラウザーに 0 という結果が返されますが、デバッグ時に、指定したクエリ文字列パラメーターが NancyFX によって認識されていないことがわかります。

4

2 に答える 2

21

ラムダへのparameters引数には、 でキャプチャしたルート パラメータが含まれますGet["/query"]。この場合は何もありません。何かがある例については、@thecodejunkie のコメントを参照してください。

クエリ パラメータを取得するには、 を使用しますRequest.Query。これも動的であり、リクエストに含まれていたすべてのクエリ パラメータが含まれます。そのようです:

 Get["/query"] = parameters =>
    {
        var rawStart = Request.Query.start;
        var rawEnd = Request.Query.end;
        var metrics = Request.Query.metrics;

        return Response.AsJson(0);
    };

これはテストでも機能するはずです。

于 2013-08-18T19:48:10.020 に答える