2016-04-19 130 views
3

我遇到NUnit告訴我的問題:「沒有找到合適的構造函數」。這是什麼原因?我還得到另一條消息:「異常沒有堆棧跟蹤」。這兩條消息只是一遍又一遍地重複。這裏是我的代碼Nunit測試結果OneTimeSetUp:找不到合適的構造函數

[TestFixture] 
public class SecurityServiceTests 
{ 
    private IContext stubIContext; 
    private ISecurityService securityService; 
    private IWindsorContainer windsorContainer; 

    public SecurityServiceTests(IContext stubIContext) 
    { 
     this.stubIContext= stubIContext; 
    } 

    [TestFixtureSetUp] 
    public void TestSetup() 
    { 
     //Mocks the database context 
     stubIContext= MockRepository.GenerateStub<IContext>(); 
     var returnedList = new List<string>(); 
     stubIContext.Stub(a => a.GetUserSecurities(null)).IgnoreArguments().Return(returnedList); 

     securityService = new SecurityService(windsorContainer); 

    } 

    [Test] 
    public void ControllerShouldGetUserGroupForCurrentUsers() 
    { 
     //Act 
     var action = securityService.CurrentUserFeatureList; 

     //Assert 
     Assert.IsNotNull(action); 
    } 


} 

回答

3

SecurityServiceTests類需要被用作TextFixture一個默認的構造函數。

docs on TextFixture

有跡象表明,作爲一個測試夾具上的類的一些限制。

它必須是公開導出的類型,否則NUnit將不會看到它。

它必須有一個默認的構造函數,否則NUnit將無法構造它。

目前尚不清楚,反正爲什麼你在該類接受,並設置IContext stubIContext,你接下來要嘲笑在安裝該領域的構造函數。

刪除public SecurityServiceTests(IContext stubIContext)構造函數,測試將運行。

編輯:這是slightly different in NUnit3,在評論中指出的@克里斯:

如果沒有參數設置有TestFixtureAttribute,類必須有一個默認的構造函數。

如果提供參數,它們必須匹配其中一個構造函數。

+0

只需要注意,在NUnit3中,TestFixtures可以被參數化。但是你是對的,這看起來不像這裏想要的。 [v3文檔](https://github.com/nunit/docs/wiki/TestFixture-Attribute) – Chris

4

您正試圖創建一個參數化燈具,因此您有一個構造函數接受一個參數。與上面的評論相反,這在NUnit V2和V3中都是有效的。

但是,爲了讓NUnit使用該構造函數,必須給它一個參數來應用,而且你還沒有這樣做。您將通過指定

[TestFixture(someArgument)] 

也許,你正打算通過分配在TestFixtureSetUp一個值stubIContext做這樣的事情做到這一點。但是,這不能工作有兩個原因:

  1. 它沒有被提供給構造函數,這就是你的燈具需要它。

  2. 無論如何,該對象的構造發生在該設置方法被調用之前。

有幾種方法可以在燈具實例化之前創建存根,特別是在NUnit v3中。然而,我實際上並沒有明白爲什麼你需要這個設備進行參數化,因爲無論如何你都使用了一個存根。

除非您有其他需要參數化的內容,在示例中未顯示,否則我只需在設置中創建存根。我的首選是使用SetUp而不是TestFixtureSetUp。創建存根並不昂貴,所以似乎沒有理由來節約。但是,如果在摘錄中沒有看到原因,TestFixtureSetUp也可以工作。

相關問題