Nunit测试给出结果OneTimeSetUp:找不到合适的构造函数

我有一个问题,NUnit告诉我:“找不到合适的构造函数”。 是什么导致这个? 我还得到另一条消息:“exception没有堆栈跟踪”。 这两条消息只是一遍又一遍地重复。 这是我的代码

[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(); var returnedList = new List(); 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赋值来做类似的事情。 但是,这有两个原因:

  1. 它没有被提供给构造函数,而这正是你的fixture需要它的地方。

  2. 无论如何,在调用该setup方法之前进行对象的构造。

有几种方法可以在实例化夹具之前创建存根,特别是在NUnit v3中。 但是,我实际上并不明白为什么你需要这个夹具进行参数化,因为你无论如何都要使用一个存根。

除非您对参数化有其他需求(示例中未显示),否则我只需在设置中创建存根。 我的偏好是使用SetUp而不是TestFixtureSetUp。 创建存根并不昂贵,因此似乎没有理由进行节约。 但是,如果在摘录中没有找到原因,TestFixtureSetUp也可以正常工作。

您的SecurityServiceTests类需要具有默认构造函数才能用作TextFixture

从TextFixture上的文档 :

对用作测试夹具的类有一些限制。

它必须是公开导出的类型,否则NUnit将无法看到它。

它必须具有默认构造函数,否则NUnit将无法构造它。

目前还不清楚为什么你在该类中有一个接受并设置IContext stubIContext的构造函数,然后继续在Setup中模拟该字段。

删除public SecurityServiceTests(IContext stubIContext)构造函数,测试将运行。

编辑:正如@Chris在评论中指出的那样,它在NUnit3中略有不同 :

如果TestFixtureAttribute没有提供参数,则该类必须具有默认构造函数。

如果提供了参数,则它们必须与其中一个构造函数匹配。