在自定义NancyFx Bootstrapper中测试代码

时间:2015-11-20 15:21:25

标签: nunit moq nancy structuremap3

我有一个使用StructureMapNancyBootstrapper的自定义Nancy Bootstrapper,但无论容器如何,问题都是一样的。

public class CustomNancyBootstrapper : StructureMapNancyBootstrapper
{
    protected override void RequestStartup(IContainer container, IPipelines pipelines, NancyContext context)
    {
        var auth = container.GetInstance<ICustomAuth>();
        auth.Authenticate(context);
    }
}

我想编写一个测试来声明使用上下文来调用Authenticate ...就像这样......

[Test]
public void RequestStartup_Calls_CustomAuth_Authenticate_WithContext()
{
    // set up
    var mockAuthentication = new Mock<ICustomAuth>();
    var mockContainer = new Mock<IContainer>();
    var mockPipelines = new Mock<IPipelines>();
    var context = new NancyContext();

    mockContainer.Setup(x => x.GetInstance<ICustomAuth>()).Returns(mockAuthentication.Object);

    // exercise
    _bootstrapper.RequestStartup(_mockContainer.Object, _mockPipelines.Object, context);

    // verify
    mockAuthentication.Verify(x => x.Authenticate(context), Times.Once);
}

问题在于我无法调用RequestStartup,因为它受NancyBootstrapperBase中的定义保护。

protected virtual void RequestStartup(TContainer container, IPipelines pipelines, NancyContext context);  

是否有适当的&#34; /&#34;官方&#34;南希方式这样做,而不创建另一个派生类,并暴露方法,因为这似乎是一个黑客?

由于

1 个答案:

答案 0 :(得分:1)

我猜您可以使用Browser中的Nancy.Testing“伪造”该请求:

 var browser = new Browser(new CustomNancyBootstrapper());

 var response = browser.Get("/whatever");

有很多关于测试NancyFx应用程序的文章: http://www.marcusoft.net/2013/01/NancyTesting1.html