gpt4 book ai didi

c# - 有没有办法让 SetUpFixture 每个类运行一次而不是每个命名空间运行一次?

转载 作者:IT王子 更新时间:2023-10-29 04:28:32 25 4
gpt4 key购买 nike

场景
首先,我是测试新手 - 所以请多多包涵。在我的测试项目 中,有一个 Controllers 文件夹。 Controllers 文件夹可能包含 ControllerATest.cs、ControllerBTest.cs 和 ControllerCTest.cs。因为我的命名空间与我的文件夹结构一致,所以它们都共享命名空间 MyProject.Tests.Controllers。

根据我在 NUnit SetUpFixture Documentation 中阅读的内容, 此命名空间内的 [SetUpFixture] 将为整个命名空间运行一次。也就是说,如果我一次运行所有 Controller 测试 - SetUpFixture 将只执行一次。

问题
正如我所说,每个 Controller 测试共享一个 namespace 。 SetUpFixtures 适用于整个命名空间。如果我希望每个 Controller 都有自己的 SetUpFixture 怎么办?当 SetUpFixtures 应用于整个 namespace 时,这是一个问题。我想要的是执行一次的东西,而不是每次测试。我在 SetUpFixture 的 SetUp 中做的一件事是实例化一个 Controller 。当然,我可以在 SetUpFixture 中实例化所有 3 个 Controller ,但是当我可能只测试 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()
{
//
}
}
}
}

我尝试过的事情

  • 将每个 .cs 文件移动到其自己的文件夹中,因此它们具有不同的命名空间。从技术上讲,这解决了问题,拥有一堆子文件夹,每个子文件夹中只有一个项目,这看起来有点难看。丑陋,并且将不再匹配我想要的父项目结构。但是 - 也许这是要走的路。
  • 不在 SetUpFixture SetUp 中实例化我的 Controller ,而是在 TestFixture SetUp 中实例化我的 Controller ,以便为每个测试实例化一个新 Controller (例如:5 次测试 = 5 个单独的实例)而不是每个类或命名空间一次。虽然看起来如果我只创建 1 个实例就可以逃脱,我应该这样做。

建议?

最佳答案

对于 NUnit 3.4.1 及更高版本,使用 OneTimeSetUp :

[TestFixture]
public class MyTest
{
[OneTimeSetUp]
public void Setup()
{
// one time setup code for this class
}
}

顺便说一下,TestFixtureSetUp已被弃用。

关于c# - 有没有办法让 SetUpFixture 每个类运行一次而不是每个命名空间运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com