将构造函数参数传递给 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来自哪里?

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

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,以允许父类获取它所需的服务对象引用。

我知道

这是一个较旧的帖子,但要具体回答您的问题:"

将构造函数参数传递给 Nunit 基类"

......并以 NUnit 样式执行此操作:

测试库.cs

[TestFixture]
public class TestBase
{
    public string Browser { get; set; }
    public IWebDriver Driver { get; set; }
    public TestBase( string _browser){ this.Browser = _browswer }
    [SetUp]
    public Setup(){
        Driver = SeleniumExtension.GetDriver(Browser);
    }
}

我的测试.cs

[TestFixture("Chrome", "IE", "Firefox")]
class MyTests : TestBase
{
     public MyTests(string _browser) : base(_browser) { }
     [Test]
     public void Test_001(){
          Driver.Goto("https://www.google.com");
     }
}

重建。
在测试资源管理器中,您现在将看到Test_001的测试夹具变体,包括所有三种类型的测试,Chrome,IE和Firefox。
您还可以访问测试中可能需要的任何类或变量,就像正常继承一样。
清理了很多测试。

呵呵!

最新更新