将构造函数参数传递给 Nunit Base class
Passing constructor parameter to Nunit Base class
我有一个生成重复测试方法的基础class。
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
}
}
我已经将此基础 class 实施到另一个测试 class,如下所示:
[TestFixture]
public class MyTest:MyBase
{
private IService2 service;
[SetUp]
public void setup()
{
service = A.Fake<IService2>();
}
public MyTest(IService2 service) : base(service)
{
}
}
这给出了错误:没有找到合适的构造函数。
MyBase
上的 [TestFixture]
属性不应该存在。作为一个抽象class,它不能被创建,所以它不是真正的夹具。
NUnit 只知道如何为您的 class 调用默认构造函数,因此您的测试装置应该具有默认构造函数。对于您的示例代码,您期望传递到 MyTest
构造函数的 service
来自哪里?
可用于实现类似目的的另一种方法是将对象的创建委托给来自抽象父对象的子 classes。所以你最终得到这样的结果:
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;
}
}
因此子 class 实现抽象方法 GetService
以允许父 class 获取它需要的服务对象引用。
我知道这是一个较旧的 post,但要具体回答你的问题:
"Passing constructor parameter to Nunit Base class"
...这是 NUnit 风格:
TestBase.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);
}
}
MyTests.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。
与正常继承一样,您还可以访问测试中可能需要的任何 class 或变量。
大量清理测试。
HTH someone!
我有一个生成重复测试方法的基础class。
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
}
}
我已经将此基础 class 实施到另一个测试 class,如下所示:
[TestFixture]
public class MyTest:MyBase
{
private IService2 service;
[SetUp]
public void setup()
{
service = A.Fake<IService2>();
}
public MyTest(IService2 service) : base(service)
{
}
}
这给出了错误:没有找到合适的构造函数。
MyBase
上的 [TestFixture]
属性不应该存在。作为一个抽象class,它不能被创建,所以它不是真正的夹具。
NUnit 只知道如何为您的 class 调用默认构造函数,因此您的测试装置应该具有默认构造函数。对于您的示例代码,您期望传递到 MyTest
构造函数的 service
来自哪里?
可用于实现类似目的的另一种方法是将对象的创建委托给来自抽象父对象的子 classes。所以你最终得到这样的结果:
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;
}
}
因此子 class 实现抽象方法 GetService
以允许父 class 获取它需要的服务对象引用。
我知道这是一个较旧的 post,但要具体回答你的问题:
"Passing constructor parameter to Nunit Base class"
...这是 NUnit 风格:TestBase.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);
}
}
MyTests.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。
与正常继承一样,您还可以访问测试中可能需要的任何 class 或变量。
大量清理测试。
HTH someone!