我可以自己调用南希模块吗?

本文关键字:模块 自己 调用 我可以 | 更新日期: 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();)。

所以基本上解决方案是实现一个视图工厂在呈现视图之前存储模型