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

时间:2016-04-19 15:00:13

标签: c# exception testing nunit

我有一个问题,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);
    }


}

3 个答案:

答案 0 :(得分:7)

您正在尝试创建参数化夹具,因此您有一个构造函数采用单个参数。与上面的评论相反,这在NUnit V2和V3中都有效。

但是,为了让NUnit使用该构造函数,你必须给它一个要应用的参数,而你还没有这样做。您可以通过指定

来完成此操作
[TestFixture(someArgument)]

或许,您打算通过在TestFixtureSetUp中为stubIContext指定值来执行类似的操作。但是,这可能有两个原因:

  1. 没有提供给构造函数以及您的夹具需要的地方。

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

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

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

答案 1 :(得分:3)

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

来自docs on TextFixture

  

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

     

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

     

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

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

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

编辑:它是slightly different in NUnit3,正如@Chris在评论中所指出的那样:

  

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

     

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

答案 2 :(得分:1)

我所拥有的,它的构造函数受到保护而不是公开的, 所以Nunit找不到。