2015-11-20 41 views
1

我有一個使用StructureMapNancyBootstrapper的自定義Nancy引導程序,但問題是相同的,無論容器。自定義NancyFx引導程序測試代碼

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

我想編寫一個測試斷言身份驗證被稱爲與上下文...這樣的事情...

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

是否有一個「正確」 /「官方」南希的方式來做到這一點,而無需創建另一個派生類和暴露方法作爲似乎只是一個黑客?

感謝

回答

1

我想你可以 「假」 通過使用BrowserNancy.Testing請求:

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

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

有一個關於測試NancyFx應用一套好的文章: http://www.marcusoft.net/2013/01/NancyTesting1.html

+0

感謝您的答覆。我看到了這一點,但覺得這是一個小小的設計,因爲它真的測試了路線,只是間接地測試了引導程序。仍然......我認爲這是最好的前進方向,所以我會標記爲答案。 – alexs

+0

是的,我知道。但他們在GitHub上有一個非常積極的發展,我建議你解決這個問題https://github.com/NancyFx/Nancy/issues –

+0

再次感謝安東, 我提出這個問題,其中也有實際的代碼需要通過以上兩種方法進行測試 https://github.com/NancyFx/Nancy/issues/2126 – alexs

1

匝out Nancy提供了一個IRequetStartup接口,這樣你就可以將代碼從定製的引導程序中取出,並執行類似這樣的操作...

public class MyRequestStart : IRequestStartup 
{ 
    private readonly ICustomAuth _customAuthentication; 

    public MyRequestStart(ICustomAuth customAuthentication) 
    { 
     if (customAuthentication == null) 
     { 
      throw new ArgumentNullException(nameof(customAuthentication)); 
     } 

     _customAuthentication = customAuthentication; 
    } 

    public void Initialize(IPipelines pipelines, NancyContext context) 
    { 
     _customAuthentication.Authenticate(context); 
    } 
} 

和測試是容易的,簡潔

[Test] 
    public void When_Initialize_Calls_CustomAuth_Authenticate_WithContext() 
    { 
     // set up 
     var mockAuth = new Mock<ICustomAuth>(); 
     var requestStartup = new MyRequestStart(mockAuth.Object); 
     var mockPipeline = new Mock<IPipelines>(); 
     var context = new NancyContext(); 

     // exercise 
     requestStartup.Initialize(mockPipeline.Object, context); 

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

https://github.com/NancyFx/Nancy/wiki/The-Application-Before%2C-After-and-OnError-pipelines#implementing-interfaces

相關問題