[英]OneTimeSetUp: No suitable constructor was found when using nunit and autofac
[英]Nunit test gives result OneTimeSetUp: No suitable constructor was found
我有一個問題,NUnit 告訴我:“找不到合適的構造函數”。 這是什么原因造成的? 我還收到另一條消息:“異常沒有堆棧跟蹤”。 這兩條消息只是一遍又一遍地重復。 這是我的代碼
[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);
}
}
您正在嘗試創建一個參數化夾具,因此您有一個采用單個參數的構造函數。 與上面的評論相反,這在 NUnit V2 和 V3 中都有效。
然而,為了讓 NUnit 使用那個構造函數,你必須給它一個要應用的參數,而你沒有這樣做。 你可以通過指定來做到這一點
[TestFixture(someArgument)]
可能您打算通過為 TestFixtureSetUp 中的 stubIContext 分配一個值來做類似的事情。 但是,由於兩個原因,這不起作用:
它沒有提供給構造函數,而這正是您的裝置需要它的地方。
無論如何,對象的構造發生在調用該設置方法之前。
有幾種方法可以在實例化夾具之前創建存根,尤其是在 NUnit v3 中。 但是,我實際上不明白為什么需要對這個裝置進行參數化,因為無論如何您都在使用存根。
除非您有其他一些參數化需求(示例中未顯示),否則我只會在設置中創建存根。 我更喜歡使用 SetUp 而不是 TestFixtureSetUp。 創建存根並不昂貴,因此似乎沒有理由節約。 但是,如果有摘錄中沒有看到的原因,TestFixtureSetUp 也可以工作。
您的SecurityServiceTests
類需要有一個默認構造函數來用作TextFixture
。
對於用作測試裝置的類有一些限制。
它必須是公開導出的類型,否則 NUnit 將看不到它。
它必須有一個默認構造函數,否則 NUnit 將無法構造它。
無論如何都不清楚為什么在該類中有一個構造函數接受並設置IContext stubIContext
,然后您繼續在 Setup 中模擬該字段。
刪除public SecurityServiceTests(IContext stubIContext)
構造函數,測試將運行。
編輯:正如@Chris 在評論中指出的那樣,它在 NUnit3 中略有不同:
如果 TestFixtureAttribute 未提供任何參數,則該類必須具有默認構造函數。
如果提供了參數,則它們必須與構造函數之一匹配。
我所擁有的,它的構造函數是受保護的而不是公共的,所以 Nunit 找不到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.