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

问题描述 投票:0回答:4

我有一个问题,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
4个回答
15
投票

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

但是,为了让 NUnit 使用该构造函数,您必须为其提供一个要应用的参数,但您尚未这样做。您可以通过指定来做到这一点

[TestFixture(someArgument)]

您可能打算通过为 TestFixtureSetUp 中的 stubIContext 赋值来执行类似的操作。然而,这行不通,原因有两个:

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

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

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

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


6
投票

您的

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

来自 TextFixture 上的文档

用作测试装置的类有一些限制。

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

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

无论如何都不清楚为什么你在该类中有一个构造函数接受并设置

IContext stubIContext
,然后你继续在设置中模拟该字段。

删除

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

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

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

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


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


0
投票
对我来说,我使用的是内存数据库,并且我调用了“context.Database.Migrate()”,这就是原因,我必须对调用进行评论。

var scope = _factory.Services.CreateScope(); var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); context.Database.EnsureDeleted(); //context.Database.Migrate(); // the issue ApplicationDbContextExtensions.Seed(context);
    
© www.soinside.com 2019 - 2024. All rights reserved.