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

Unit testing 如何明确指定视图的位置?,unit-testing,nunit,appharbor,nancy,Unit Testing,Nunit,Appharbor,Nancy,首先,我知道问题是什么,我只是不太了解南希,不知道如何解决它 作为appharbor构建过程的一部分,我有一个单元测试失败。同样的测试在NCrunch执行时也会失败。但是,当VS2012执行时,它运行良好 测试如下所示: [Test] public void Get_Root_Should_Return_Status_OK() { // Given var browser = new Browser(new Bootstrapper()); // When va

首先,我知道问题是什么,我只是不太了解南希,不知道如何解决它

作为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);
}
Get["/"] = _ => View["home.sshtml"];
处理
“/”
路径的HomeModule部件如下所示:

[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);
}
Get["/"] = _ => View["home.sshtml"];
home.sshtml
位于视图文件夹中

如果我将上述内容替换为:

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));
}

问题的原因是,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>();
  ...
});
var-browserParser=新浏览器(使用=>
{
...
使用.RootPathProvider();
...
});
缺点是部署时需要从
/bin
目录中删除视图目录



另一种方法是做你已经做过的事情,嵌入你的视图

我想Bootstrapper是你主要项目中的Bootstrapper?里面有什么东西可以打破它吗?您是将sshtml文件用作嵌入式资源,还是只是正常使用?你不应该在应用程序启动中需要mods,所以我相信会有一些简单的事情发生。Pop by我已将视图嵌入到部件中作为解决方案。现在到处都能通过考试。