c# - 将构造函数参数传递给 Nunit 基类

标签 c# .net unit-testing nunit

我有一个基类来生成重复的测试方法。

public interface IService1 { }
public interface IService2: IService1 { }

[TestFixture]
public abstract class MyBase
{
    private readonly IService1 service;

    protected MyBase(IService1 service)
    {
        this.service = service;
    }

    [Test]
    public void test1()
    {
        //service.callmethod
    }
}

我已经将这个基类实现到另一个测试类,如下所示:

[TestFixture]
public class MyTest:MyBase
{
    private IService2 service;

    [SetUp]
    public void setup()
    {
        service = A.Fake<IService2>();
    }

    public MyTest(IService2 service) : base(service)
    {
    }
}

这给出了错误:没有找到合适的构造函数

最佳答案

MyBase 上的[TestFixture] 属性不应该存在。作为一个抽象类,它不能被创建,所以它不是真正的夹具。

NUnit 只知道如何为您的类调用默认构造函数,因此您的测试装置应该具有默认构造函数。对于您的示例代码,您期望传递到 MyTest 构造函数的 service 来自哪里?

可用于实现类似事情的替代方法是将对象的创建委托(delegate)给抽象父类的子类。所以你最终得到这样的东西:

public abstract class MyBase
{
    [Test]
    public void test1()
    {
        GetService().callmethod();
    }

    public abstract IService1 GetService();
}


[TestFixture]
public class MyTest:MyBase
{
    private IService2 service;


    [SetUp]
    public void setup()
    {
        service = A.Fake<IService2>();
    }

    public override IService1 GetService()
    {
        return service;
    }
}

于是子类实现抽象方法GetService让父类获取它需要的服务对象引用。

关于c# - 将构造函数参数传递给 Nunit 基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076912/

相关文章:

c# - 如何在同一个帖子中上传数据和文件?

c# - 是否需要在 CollectionChanged 事件中检查 NotifyCollectionChangedAction?

.net - 引用的程序集复制规则

c# - 如何限制 Parallel.ForEach?

unit-testing - Junit 中是否有任何理由不在声明时创建对象?

Python:在单元测试中处理sys.exit?

c# - Xamarin 表单 - 自定义 JSON 的可观察集合

C#:用 *single*\替换 single/

c# - 在 C# (WPF) 中,当 UI 线程中的数据立即更改时,是否会发生数据绑定(bind)?

java - 我正在尝试为插入时间表的方法编写一个 JUnit 测试用例,该时间表将参数作为员工 ID。我应该如何尝试?