【问题标题】:How to check if current unit test has a particular attribute如何检查当前单元测试是否具有特定属性
【发布时间】:2015-07-02 09:41:57
【问题描述】:

在我的单元测试中,我需要测试对数据库的查询(不,我不是在模拟这些,因为我需要检查它们是否获得了正确的数据)。我也有一些完全不联系数据库的普通方法,以及一些可以对数据库使用模拟的方法。

为了应对数据库单元测试,我创建了一个名为DbUnitTest 的类,如果需要连接到数据库,每个单元测试类(用于服务)都可以从该类继承。

这个类看起来是这样的

[TestClass]
public abstract class DbUnitTest
{
    protected IDataContext _context;

    [TestInitialize]
    public void TestInit()
    {
        _context = new DataContext();

        // drop if exists
        if (_context.Database.Exists())
            _context.Database.Delete();

        // initialize
        System.Data.Entity.Database.SetInitializer(new ForceDeleteInitializer(new DbUnitTestInitializer()));

        _context.Database.Initialize(true);
    }

}

这可行,并且对于每个测试,它都会删除数据库并创建一个新数据库。然后我可以在每个单元测试中插入我想要的任何数据并检查数据是否正确。

但是现在我正在单元测试的一些服务类不需要真正的数据库,因此删除数据库、初始化数据库等似乎没有意义,因为这需要时间。

我想也许我可以针对每个测试创建一个属性,例如 UseDb 和 UseMock。然后在我的基础 DbUnitTest 类中,我可以将方法更改为这样的

[TestClass]
public abstract class DbUnitTest
{
    protected IDataContext _dbContext;
    protected Mock<IDataContext> _mockContext;

    [TestInitialize]
    public void TestInit()
    {
        // How do I check for an attribute here??
        if (method has UseDb attribute)
        {
            _dbContext = new DataContext();

            // drop if exists
            if (_dbContext.Database.Exists())
                .Database.Delete();

            // initialize
            System.Data.Entity.Database.SetInitializer(new ForceDeleteInitializer(new DbUnitTestInitializer()));

            _dbContext.Database.Initialize(true);
        }

        if (UseMock attribute)
        {
            // mock context
            _mockContext = new Mock<IDataContext>();
        }
    }

}

但我不确定如何确定当前正在运行的单元测试方法是否包含特定属性,或者是否可以确定?

这将使我受益于每个测试都能够创建新数据库或使用模拟。

谁能帮帮我?

我知道我真的可以将单元测试类拆分为 2 个文件,但我认为这会将服务的所有测试保存在一个地方并提供灵活性。

【问题讨论】:

  • 我打算建议一种多文件方法 - 但我看到你已经考虑过了。无法通过解决方案提供任何东西 - 但我很想看看是否有其他解决方法。

标签: c# asp.net .net unit-testing testing


【解决方案1】:

您似乎正在使用 MS 测试运行程序。如果你是,那么你可以在你的类中添加一个TestContext 属性:

public TestContext TestContext { get; set; }

这将在运行测试时由测试引擎填充。在您的测试初始化​​中,您可以使用TestContext.Name 属性来标识当前正在运行的测试的名称。所以你可以做这样的事情来检查测试方法的属性:

var useDbAttr = GetType().GetMethod(TestContext.TestName)
                         .GetCustomAttributes(typeof(UseDbAttribute), true);
if(useDbAttr.Length > 0) {
    // Setup for DB calls
} else {
    // Setup for mocked calls
}

【讨论】:

  • 喜欢这个,但我最终根据需要将单独的文件根目录下,以便快速完成,并且时间不多了。不过答案很好!
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 2022-06-25
  • 2021-03-12
  • 1970-01-01
  • 2012-04-16
  • 2018-02-09
  • 1970-01-01
  • 2023-02-23
相关资源
最近更新 更多