与Nancy的ConfigurableBootstrapper一起使用自定义视图位置约定时出错

时间:2014-04-07 14:43:39

标签: nancy

我正在使用 ConfigurableBootstrapper 的子类来测试我的Nancy模块。这是一个解决方法,让ConfigurableBootstrapper获取我在“真正的”引导程序中使用的自定义视图位置约定:

public class ConfigurableBootstrapperWithCustomConvention : ConfigurableBootstrapper
{
    public ConfigurableBootstrapperWithCustomConvention(Action<ConfigurableBootstrapperConfigurator> configuration)
        : base(configuration)
    {
    }

    protected override void ConfigureConventions(NancyConventions nancyConventions)
    {
        nancyConventions.ViewLocationConventions.Add((viewName, model, context) => 
            string.Concat(context.ModuleName, "/Views/", viewName));
        base.ConfigureConventions(nancyConventions);
    }
}

在我的测试中,我首先使用 FakeRootPathProvider 将根路径设置为我的nancy项目的路径。这包含 HomeModule 中使用的视图所需的文件夹结构(“/Home/Views/Index.cshtml”)使用此自定义约定。 (简化)测试代码:

[Test]
public void when_the_default_page_is_loaded_it_should_show_links_to_submit_form()
{
    FakeRootPathProvider.RootPath = "../../../MyApp.Web";

    var bootstrapper = new ConfigurableBootstrapperWithCustomConvention(with =>
    {
        with.RootPathProvider(new FakeRootPathProvider());
        with.ViewEngine<RazorViewEngine>();
        with.Module<HomeModule>();
    });

    var browser = new Browser(bootstrapper);
    var response = browser.Get("/");

    Assert.That(response.Body.AsString(), Is.StringContaining("<a href=\"SubmitSelf\">"));
}

当我运行此测试时,我得到以下异常(在调用 response.Body 时):

System.ArgumentNullException : Value cannot be null.
Parameter name: httpContext
   at System.Web.HttpContextWrapper..ctor(HttpContext httpContext)
   at System.Web.Optimization.Styles.RenderFormat(String tagFormat, String[] paths)
   at RazorOutput.RazorView.Execute()
   at Nancy.ViewEngines.Razor.NancyRazorViewBase`1.ExecuteView(String body, IDictionary`2 sectionContents)
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid3<T0,T1,T2>(CallSite site, T0 arg0, T1 arg1, T2 arg2)
   at Nancy.ViewEngines.Razor.RazorViewEngine.<>c__DisplayClass27.<RenderView>b__26(Stream stream)
   at Nancy.Testing.BrowserResponse.get_Body()
   at MyApp.Tests.Integration.Web.Home.HomeModuleTests.when_the_default_page_is_loaded_it_should_show_links_to_submit_form() in HomeModuleTests.cs: line 44

如果我将伪根路径设置为“../../../MyApp.Web/Home/Views”,则测试运行正常。 (使用Nancy的“浏览器”类进行测试时,似乎忽略了自定义视图位置约定。

  • 以这种方式设置NancyConvention有问题吗?
  • 如果是这样,使用 ConfigurableBootstrapper 设置视图位置约定有不同的方法吗?

0 个答案:

没有答案