首先我知道问题是什么,我只是不知道Nancy知道如何修复它。
作为appharbor构建过程的一部分,我的单元测试失败了。 NCrunch执行时,同样的测试也会失败。但是,当由VS2012执行时,它可以正常工作。
测试如下:
[Test]
public void Get_Root_Should_Return_Status_OK()
{
// Given
var browser = new Browser(new Bootstrapper());
// When
var result = browser.Get("/");
// Then
Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
}
处理"/"
路线的HomeModule部分如下所示:
Get["/"] = _ => View["home.sshtml"];
home.sshtml
位于Views文件夹中。
如果我将以上内容替换为:
Get["/"] = _ => "Hello World!;
然后测试变绿了。
显而易见的问题是,在NCrunch和appharbor中运行测试时,无法找到home.sshtml
文件。
如何明确告诉Nancy文件在哪里?
PS正在将视图文件复制到输出目录。
PPS我也尝试过明确地告诉Nancy视图是什么样的,这也不起作用。
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
var directoryInfo = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory;
if (directoryInfo != null)
Environment.CurrentDirectory = directoryInfo.FullName;
Conventions.ViewLocationConventions.Add((viewName, model, viewLocationContext) => String.Concat("Views/", viewName));
}
答案 0 :(得分:1)
问题是由于NCrunch在编译和复制bin目录以运行测试时不会将视图复制到输出目录。
您需要做的是将视图设置为“始终复制”,然后在单元测试项目中添加IRootPathProvider实现:
public class StaticPathProvider : IRootPathProvider
{
public static string Path { get; set; }
public string GetRootPath()
{
return Path;
}
}
(在路径上不完全确定,我不记得了,认为这只是执行装配的地方)
并在你的引导程序中注册它以进行单元测试。
var browserParser = new Browser(with =>
{
...
with.RootPathProvider<StaticPathProvider>();
...
});
下行是在部署时需要从/bin
目录中删除视图目录。
另一种方法是做你已经完成的事情,嵌入你的观点。