方案
首先,我是新手测试 - 所以请耐心等待。在我的测试项目中,有一个Controllers文件夹。 Controllers文件夹可能包含ControllerATest.cs,ControllerBTest.cs和ControllerCTest.cs。因为我的命名空间与我的文件夹结构一致,所以它们共享命名空间MyProject.Tests.Controllers。
根据我在NUnit SetUpFixture Documentation中读到的内容,此命名空间内的[SetUpFixture]将为整个命名空间运行一次 。也就是说,如果我一次运行所有控制器测试 - SetUpFixture将只执行一次。
问题
正如我所说,每个控制器测试共享一个命名空间。 SetUpFixtures适用于整个命名空间。如果我希望每个控制器拥有拥有 SetUpFixture,该怎么办?当SetUpFixtures应用于整个名称空间时,这是一个问题。我想要的是一次执行,而不是每次测试。我在SetUpFixture的SetUp中做的一件事就是实例化一个控制器。当然,我可以在SetUpFixture中实例化所有3个控制器,但是当我可能只测试ControllerC时,这看起来很难看。这真的不干净。因此,我希望SetUpFixture将仅应用于它出现的类,例如ControllerCTests。
据我所知,NUnit似乎无法实现这一特定功能。如果NUnit无法实现,那么我认为这不是常见的情况。如果这不是常见的情况,我做错了。我的问题是,什么?也许我的测试结构已关闭,需要更改。或者使用NUnit可能
代码
我想要的结构的一个例子:
namespace MyProject.Tests.Controllers
{
public class ControllerATests
{
private static IMyProjectRepository _fakeRepository;
private static ControllerA _controllerA;
[SetUpFixture]
public class before_tests_run
{
[SetUp]
public void ControllerASetup()
{
_fakeRepository = FakeRepository.Create();
_controllerA = new ControllerA(_fakeRepository);
}
}
[TestFixture]
public class when_ControllerA_index_get_action_executes
{
[Test]
public void it_does_something()
{
//
}
[Test]
public void it_does_something_else()
{
//
}
}
}
public class ControllerBTests
{
private static IMyProjectRepository _fakeRepository;
private static ControllerB _controllerB;
[SetUpFixture]
public class before_tests_run
{
[SetUp]
public void ControllerBSetup()
{
_fakeRepository = FakeRepository.Create();
_controllerB = new ControllerB(_fakeRepository);
}
}
[TestFixture]
public class when_ControllerB_index_get_action_executes
{
[Test]
public void it_does_something()
{
//
}
[Test]
public void it_does_something_else()
{
//
}
}
}
}
我尝试的事情
建议?
答案 0 :(得分:46)
对于NUnit 3.4.1 及更高版本,请使用OneTimeSetUp:
[TestFixture]
public class MyTest
{
[OneTimeSetUp]
public void Setup()
{
// one time setup code for this class
}
}
顺便说一句,TestFixtureSetUp已被弃用。
答案 1 :(得分:20)
对Controller类中的方法使用TestFixtureSetUpAttribute
:
[TestFixture]
public class when_ControllerA_index_get_action_executes
{
[TestFixtureSetUp]
public void FixtureSetUp()
{
// this code runs once no matter how many tests are in this class
}
[Test]
public void it_does_something()
{
// ...
}
}
来自文档:
此属性在TestFixture中用于提供一组函数,这些函数在执行夹具中的任何测试之前执行一次。
此处,“TestFixture”与class
同义。