Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查当前单元测试是否具有特定属性_C#_Asp.net_.net_Unit Testing_Testing - Fatal编程技术网

C# 如何检查当前单元测试是否具有特定属性

C# 如何检查当前单元测试是否具有特定属性,c#,asp.net,.net,unit-testing,testing,C#,Asp.net,.net,Unit Testing,Testing,在我的单元测试中,我需要测试对数据库的查询(不,我不是在模拟这些查询,因为我需要检查它们是否获得了正确的数据)。我还有一些根本不联系数据库的普通方法,还有一些方法可以使用模拟来访问数据库 为了处理数据库单元测试,我创建了一个名为DbUnitTest的类,如果需要连接到数据库,每个单元测试类(对于服务)都可以从中继承 这个班看起来是这样的 [TestClass] public abstract class DbUnitTest { protected IDataContext _conte

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

为了处理数据库单元测试,我创建了一个名为
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>();
        }
    }

}
[TestClass]
公共抽象类DbUnitTest
{
受保护的IDataContext\u dbContext;
受保护的Mock\u mockContext;
[测试初始化]
公共无效测试()
{
//如何在此处检查属性??
if(方法具有UseDb属性)
{
_dbContext=newdatacontext();
//如果存在,请删除
if(_dbContext.Database.Exists())
.Database.Delete();
//初始化
System.Data.Entity.Database.SetInitializer(新的ForceDeleteInitializer(新的DbUnitTestInitializer());
_dbContext.Database.Initialize(true);
}
if(UseMock属性)
{
//模拟上下文
_mockContext=newmock();
}
}
}
但我不确定如何确定,或者是否有可能确定当前正在运行的单元测试方法是否包含特定属性

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

有人能帮我吗


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

看起来您使用的是MS Test runner。如果是,则可以向类添加
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
}

我本来打算建议使用多文件方法,但我知道您已经考虑过了。我无法提供任何解决方案,但我很想看看是否有其他解决方案。我喜欢这个,但我最终按照需要在单独的文件根目录下快速完成,时间不多了。回答得很好!