使用基类进行集成测试

Quo*_*ter 2 c# integration-testing unit-testing

我的集成测试基类:

[TestClass]
public class BaseIntegrationTest
{
    protected readonly ApplicationDbContext _dbContext;

    public BaseIntegrationTest()
    {
        _dbContext = new ApplicationDbContext("DefaultConnectionTest");
    }

    [ClassInitialize]
    public void Initialize()
    {
        InsertTestData();
    }

    public void InsertTestData()
    {
        _dbContext.Users.Add(new User { Name = "John Doe" });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个继承自的测试类BaseIntegrationTest

[TestClass]
public class UserRepositoryTests : BaseIntegrationTest
{
    // how to lose this method here and use the one in the BaseIntegrationTest?
    //[ClassInitialize]
    //public static void Setup(TestContext context)
    //{
    //  BaseIntegrationTest test = new BaseIntegrationTest();
    //  test.InsertTestData();
    //}

    [TestMethod]
    public void GetUser()
    {
        Filter f = new Filter()
        {
            Name = "John Doe"
        };

        UserRepository fr = new UserRepository(_dbContext);
        var result = fr.GetUser(f);

        Assert.IsTrue(result.Any(x => x.Name == "John Doe"));
    }
}
Run Code Online (Sandbox Code Playgroud)

从不使用[ClassInitialize]属性修饰的方法BaseIntegrationTest永远不会执行,因此,我的测试失败。没有数据插入数据库。

但是,如果我取消注释public static void Setup(TestContext context)UserRepositoryTests它将起作用。

我还有一些要测试的存储库。而且我希望将数据插入基类中完成的数据库中,以便我可以运行所有测试,而无需为要测试的每个存储库重新创建数据库。

转换public void Initialize()public static void Initialize(TestContext context)也不起作用。将Initialize()不会得到执行/调用。

我想念什么吗?还是单元测试/集成测试的这些限制?我是单元测试/集成测试的新手。

Rob*_*ell 5

从MSDN:

意志被用于同样的方法[TestInitialize]工作, [ClassInitialize]在基类?

不完全是,如果您[ClassInitialize]在基类中创建一个属性方法,则除非您在派生的测试类ClassInitialize 方法的开头显式调用它,否则它将永远不会被调用。当然,哪种方法都不比上述方法好。

http://blogs.msdn.com/b/densto/archive/2008/05/16/using-a-base-class-for-your-unit-test-classes.aspx

稍后将介绍如何在继承类中的任何方法之前进行初始化:

如何创建一个初始化方法,该方法将在测试项目中的任何类初始化方法之前运行?

在上述通用基类方法的基础上,您可以简单地向基类中添加静态构造函数,然后在其中执行初始化或调用将执行所需初始化的方法。产生的基类可能如下所示:

[TestClass]
public class TestBase
{
    static TestBase()
    {
        s_log = new StringBuilder();
        Log.AppendLine("TestBase.ctor()");
    }

    [TestInitialize]
    public void BaseTestInit()
    {
        Log.AppendLine("TestBase.BaseTestInit()");
    }

    [TestCleanup]
    public void BaseTestCleanup()
    {
        Console.WriteLine(Log.ToString());
    }

    public static StringBuilder Log
    {
        get { return s_log; }
    }

    static StringBuilder s_log;
} 
Run Code Online (Sandbox Code Playgroud)

  • 如果我从静态构造函数中调用InsertTestData(),那么我也必须使InsertTestData()成为静态对象,并使所有其他从静态构造函数中调用的方法也变为静态。这行得通,但是我怀疑它的优雅。谢谢! (2认同)