【问题标题】:Nunit test gives result OneTimeSetUp: No suitable constructor was foundNunit 测试给出结果 OneTimeSetUp: 没有找到合适的构造函数
【发布时间】:2016-04-19 15:00:13
【问题描述】:

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


}

【问题讨论】:

    标签: c# exception testing nunit


    【解决方案1】:

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

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

    [TestFixture(someArgument)]
    

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

    1. 它没有提供给构造函数,而这正是您的夹具需要它的地方。

    2. 无论如何,对象的构造发生在调用该设置方法之前。

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

    除非您有其他参数化需要(未在示例中显示),否则我将简单地在设置中创建存根。我的偏好是使用 SetUp 而不是 TestFixtureSetUp。创建存根并不昂贵,因此似乎没有理由节省。但是,如果有摘录中没有看到的原因,TestFixtureSetUp 也可以工作。

    【讨论】:

      【解决方案2】:

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

      来自docs on TextFixture:

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

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

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

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

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

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

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

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

      【讨论】:

      • 只是需要注意的是,在 NUnit3 中,TestFixtures 是可以参数化的。但你是对的,这看起来不像这里想要的。 v3 Docs
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        相关资源
        最近更新 更多