【问题标题】:Visual Studio Unit tests: run initialization code before each testVisual Studio 单元测试:在每次测试之前运行初始化代码
【发布时间】:2016-10-18 03:31:40
【问题描述】:

我正在使用 Visual Studio 的测试工具进行单元测试。我需要一些初始化代码来运行在每次测试之前。

我有一个用于初始化代码的Setup 类。我已经使用[AssemblyInitialize]在每次测试运行之前添加了要运行的代码,但我不知道如何在单个测试的基础上执行相同的操作。

我尝试使用[TestInitialize] 属性,但这仅适用于与[TestInitialize] 方法在同一文件中的测试。我希望初始化代码为程序集中的所有测试自动运行,而不必在每个测试文件中显式调用它。

[TestClass]
public class Setup
{
    [AssemblyInitialize]
    public static void InitializeTestRun(TestContext context)
    {
        //... code that runs before each test run
    }

    [TestInitialize] //this doesn't work!
    public static void InitializeTest()
    {
        //... code that runs before each test
    }
}

【问题讨论】:

  • 没有对每个测试运行的 AssemblyInitialize 等效项。我认为您必须将所有类都建立在一个公共基类上才能做到这一点。初始化时需要做什么?可能还有其他方法。
  • 基本上我通过使用内存数据库集来模拟实体框架上下文,以避免实际调用真实数据库。我想为每个测试创建一个新的上下文实例,即一个干净、空的“db”,这样测试就不会相互干扰。
  • 我不确定是否有一种干净的方法可以做到这一点,您的所有测试文件可能都必须有自己的 TestInitialize 方法来调用数据库初始化。
  • 对 MSTest 了解不够,但以下应该可以工作(至少它可以与其他测试框架一起工作):使用 TestInitialize 方法创建一个基类 DatabaseIntegrationTests。从该基类派生您的其他测试类。
  • @tobsen 如果您将您的评论转换为答案,我会接受它

标签: c# visual-studio unit-testing visualstudio.testtools


【解决方案1】:

以下应该可以工作(至少它可以与其他测试框架一起工作):

  • 使用TestInitialize 方法创建基类DatabaseIntegrationTests
  • 从该基类派生您的其他测试类

【讨论】:

    【解决方案2】:

    它 is [TestInitialize] 但你的语法错误,它不需要上下文:

    [TestInitialize]
    public static void InitializeTests()
    {
        //... code that runs before each test
    }
    

    【讨论】:

    • 我确实弄错了语法(我会在问题中调整它),但遗憾的是这并不能解决问题:TestInitialize 不适用于另一个文件中的测试
    • 其他文件是同一类的部分文件吗? IIRC InitializeTests 将仅针对周围类的所有测试运行(在您的情况下为公共类设置)
    • 不,不是。我有很多测试类,但只有一个 Setup 类。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    相关资源
    最近更新 更多