gpt4 book ai didi

南希测试 GetModel 抛出 KeyNotFoundException

转载 作者:行者123 更新时间:2023-12-01 09:44:26 24 4
gpt4 key购买 nike

我正在尝试测试从我的 Nancy 应用程序返回的模型是否符合预期。我已关注文档 here但每当我调用 GetModel<T>扩展方法它抛出 KeyNotFoundException .

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.

我知道错误的含义,但我不明白为什么会抛出它。

这是我的模块
public class SanityModule : NancyModule
{
public SanityModule()
{
Get["sanity-check"] = _ => Negotiate.WithModel(new SanityViewModel { Id = 1 })
.WithStatusCode(HttpStatusCode.OK);
}
}

我的 View 模型
public class SanityViewModel
{
public int Id { get; set; }
}

这是我的测试
[TestFixture]
public class SanityModuleTests
{
[Test]
public void Sanity_Check()
{
// Arrange
var browser = new Browser(with =>
{
with.Module<SanityModule>();
with.ViewFactory<TestingViewFactory>();
});

// Act
var result = browser.Get("/sanity-check", with =>
{
with.HttpRequest();
with.Header("accept", "application/json");
});
var model = result.GetModel<SanityViewModel>();

// Asset
model.Id.ShouldBeEquivalentTo(1);
}
}

调试这个测试表明该模块被命中并且完成得很好。运行应用程序显示响应符合预期。

任何人都可以对此有所了解吗?

最佳答案

感谢可爱的家伙们,albertjanthe.fringe.ninja , 在 Nancy Jabbr room我们已经解释了这里发生的事情。

TL;DR 这不起作用是有道理的,但错误消息应该更具描述性。下面有一个解决方法。

这里的问题是我请求响应为 application/json在使用 TestingViewFactory 时.

我们来看看GetModel<T>();的实现

public static TType GetModel<TType>(this BrowserResponse response)
{
return (TType)response.Context.Items[TestingViewContextKeys.VIEWMODEL];
}

这只是从 NancyContext 中获取 View 模型。并将其转换为您的类型。 这是引发错误的地方,因为 NancyContext 中没有 View 模型 .这是因为 View 模型被添加到 RenderView 中的 NancyContext 中。 TestingViewFactory的方法.
public Response RenderView(string viewName, dynamic model, ViewLocationContext viewLocationContext)
{
// Intercept and store interesting stuff
viewLocationContext.Context.Items[TestingViewContextKeys.VIEWMODEL] = model;
viewLocationContext.Context.Items[TestingViewContextKeys.VIEWNAME] = viewName;
viewLocationContext.Context.Items[TestingViewContextKeys.MODULENAME] = viewLocationContext.ModuleName;
viewLocationContext.Context.Items[TestingViewContextKeys.MODULEPATH] = viewLocationContext.ModulePath;

return this.decoratedViewFactory.RenderView(viewName, model, viewLocationContext);
}

我的测试是请求 json,因此不会调用 RenderView。这意味着您只能使用 GetModel<T>如果您使用 html 请求。

解决方法

我的应用程序是一个 api,所以我没有任何 View ,所以换行
with.Header("accept", "application/json");


with.Header("accept", "text/html");

将抛出 ViewNotFoundException .为避免这种情况,我需要实现自己的 IViewFactory . (来自 the.fringe.ninja )
public class TestViewFactory : IViewFactory
{
#region IViewFactory Members

public Nancy.Response RenderView(string viewName, dynamic model, ViewLocationContext viewLocationContext)
{
viewLocationContext.Context.Items[Fixtures.SystemUnderTest.ViewModelKey] = model;
return new HtmlResponse();
}

#endregion
}

那么它只是一个更新的案例
with.ViewFactory<TestingViewFactory>();


with.ViewFactory<TestViewFactory>();

现在 GetModel<T>应该无需 View 即可工作。

关于南希测试 GetModel<T> 抛出 KeyNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25652619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com