我正在我的应用程序中运行一个自托管的NancyFX Web服务器.现在我有一个托管的模块:
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);
};
}
}
Run Code Online (Sandbox Code Playgroud)
我的Bootstrapper类是:
public class OverlookBootStrapper : DefaultNancyBootstrapper
{
private readonly IStorageEngine _storageEngine;
public OverlookBootStrapper(IStorageEngine storageEngine)
{
_storageEngine = storageEngine;
}
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
container.Register(_storageEngine);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图通过以下测试来测试它:
[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());
}
Run Code Online (Sandbox Code Playgroud)
调试此测试并打开断点时return Response.AsJson(0);,我检查了参数对象并注意到它parameters.Count为零,并且所有3个值都为空.
我做错了什么?
编辑:当我在Web浏览器中调出此端点时,会出现同样的问题.我得到0的结果发送回我的浏览器,但是在调试时我发现NancyFX没有识别出我指定的查询字符串参数.
Chr*_*dal 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);
};
Run Code Online (Sandbox Code Playgroud)
这也适用于您的测试.