如何明确指定Nancy视图的位置?

时间:2013-12-13 10:41:43

标签: unit-testing nunit appharbor nancy

首先我知道问题是什么,我只是不知道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));
}

1 个答案:

答案 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目录中删除视图目录。


另一种方法是做你已经完成的事情,嵌入你的观点。