Sequence包含NancyBootstrapperBase类的多个元素

时间:2013-02-28 15:12:15

标签: unit-testing exception nancy

我无法弄清楚为什么这个例外被抛出...... 我有一个单元测试:

[Test]
public void Should_return_status_ok_when_route_exists()
{
    // Given
    var bootstrapper = new DefaultNancyBootstrapper();
    var browser = new Browser(bootstrapper);

    // When
    var result = browser.Get("/", with =>
                                        {
                                            with.HttpRequest();
                                        });
    // Then
    Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);

}

当浏览器变量被分配时,异常抛出Nancy Bootstrapper Base类并跟随堆栈跟踪

System.InvalidOperationException:Sequence包含多个元素

at System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source)
at Nancy.Bootstrapper.NancyBootstrapperBase`1.GetRootPathProvider() in NancyBootstrapperBase.cs: line 558
at Nancy.Bootstrapper.NancyBootstrapperBase`1.get_RootPathProvider() in NancyBootstrapperBase.cs: line 172
at Nancy.Bootstrapper.NancyBootstrapperBase`1.GetAdditionalInstances() in NancyBootstrapperBase.cs: line 514
at Nancy.Bootstrapper.NancyBootstrapperBase`1.Initialise() in NancyBootstrapperBase.cs: line 242
at Nancy.Testing.Browser..ctor(INancyBootstrapper bootstrapper) in Browser.cs: line 39
at Tests.Tests.Should_return_status_ok_when_route_exists() in Tests.cs: line 34

3 个答案:

答案 0 :(得分:1)

我在Nancy 0.16.1上看到了一个新的测试程序集,该程序集将Nancy,Nancy.Testing和项目引用(在VS2010中)引用到包含我的模块的主服务程序集。

服务程序集引用Nancy.Hosting.Self。

测试程序集的构建将Nancy.Hosting.Self.dll拉入构建文件夹,测试因您描述的错误而失败。

手动从构建文件夹中删除主机dll可解决错误,并且测试变为绿色,例如删除MyTests\bin\Debug\Nancy.Hosting.Self.dll

答案 1 :(得分:1)

在使用引用Nancy.Hosting.Self的项目进行测试时,我也遇到了同样的问题。

我的解决方法是创建一个CustomBootstrapper并覆盖RootPathProvider属性。

    class TestBootStrapper : DefaultNancyBootstrapper{
    protected override IRootPathProvider RootPathProvider {
        get {
            return new FakeRootPathProvider();
        }
    }
}

答案 2 :(得分:1)

我最近遇到了同样的问题。我试图像这样解决Nancy模块来测试我的引导程序:

[Test]
public void PushModule_Is_Resolvable()
{
  var pushModule = mUnderTest.GetModule(typeof (PushModule), new NancyContext());
  Assert.That(pushModule, Is.Not.Null);
}

这产生了问题中描述的例外情况。在阅读了Chris的回答之后,我只是将dll配置为不会被复制到Visual Studio中的输出文件夹中:

  • 在已测试的项目中找到Nancy.Hosting.Self参考。
  • 右键单击引用,然后选择“属性”。
  • 将本地复制设置为 false
  • 清理并重建您的解决方案。

这解决了我的问题。 我会发布这个作为对Chris回答的评论,但由于这是我的第一篇文章,我只能发帖回答。