我可以自己调用南希模块吗?
本文关键字:模块 自己 调用 我可以 | 更新日期: 2023-09-27 18:13:06
假设我有这个Nancy Module
public class ProductModule : NancyModule
{
public ProductModule(IProductRepository repo)
{
Get["/products/list"] = _ =>
{
ViewBag.Categories = repo.GetAllCategories();
return repo.GetAllProducts();
};
}
}
我使用Razor作为ViewEngine,我能够显示产品列表。
现在我希望能够在Windows窗体应用程序中执行相同的请求。我知道我可以这样做
var bootstrapper = new CustomBootstrapper();
bootstrapper.Initialise();
var engine = bootstrapper.GetEngine();
var request = new Request("GET", "/products/list.xml", "http");
var context = engine.HandleRequest(request);
无论如何,这不适合我的需要,因为它涉及到整个http管道和序列化我的IQueryable
。但是在我的windows窗体应用程序中,我已经对IQueryable<>
对象有了适当的分页支持。目前我应该有一些多余的代码与
public class ProductController
{
dynamic ViewBag = new ExpandoObject();
public dynamic List()
{
ViewBag.Categories = repo.GetAllCategories();
return repo.GetAllProducts();
}
}
我想去掉它,只使用南茜模块。
基本上这必须是可能的,因为,在我的剃刀视图我有我想要的,并有完全访问ViewBag和模型。
我已经下载了源代码,但还没有找到正确的按钮来按
虽然我不确定为什么@eth0的建议不适合您的具体情况,但Nancy.Testing
至少提供了一种绕过网络堆栈的方法。
var bootstrapper = new CustomBootstrapper();
var browser = new Browser(bootstrapper);
var result = browser.Get("/products/list.xml", with => { with.HttpRequest(); });
有关详细信息,请参阅官方文档:测试您的应用程序
我想我在nancy测试框架中找到了一个解决方案
使用测试扩展深入挖掘
public class GetModelExtententionsTests
{
private readonly Browser _browser;
public GetModelExtententionsTests()
{
this._browser = new Browser(with => {
with.Module<AModuleToTestExtensionMethodsWith>();
with.ViewFactory<TestingViewFactory>();
});
}
[Fact]
public void Can_get_the_model_and_read_the_values()
{
var response = this._browser.Get("/testingViewFactory");
var model = response.GetModel<ViewFactoryTestModel>();
Assert.Equal("A value", model.AString);
}
}
注意:使用这些扩展方法需要使用TestingViewFactory,在测试浏览器对象上设置。这是一个包装纸ViewFactory,它保存模型,然后使用扩展方法。你不必想太多,只需要确保设置TestingViewFactory(例如:with.ViewFactory();)。
所以基本上解决方案是实现一个视图工厂在呈现视图之前存储模型