gpt4 book ai didi

c# - 使用基类进行集成测试

转载 作者:行者123 更新时间:2023-12-03 22:08:33 25 4
gpt4 key购买 nike

我的集成测试基类:

[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" });
}
}

这是一个继承自 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"));
}
}

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

但是,如果我取消注释 UserRepositoryTests 中的 public static void Setup(TestContext context) ,它就可以工作。

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

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

我错过了什么吗?或者这些是单元测试/集成测试的局限性?我对单元测试/集成测试还很陌生。

最佳答案

来自 MSDN:

Will the same approach that was used for [TestInitialize] work with [ClassInitialize] in a base class?

Not exactly, if you create a [ClassInitialize] attributed method in the base class it won’t ever get called unless you explicitly call it at the beginning of your derived test classes ClassInitialize method; which of course is nowhere near as nice as the above approach.

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

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

How can I create an initialization method that will run before any class initialization methods in my test project?

Building on the common base class approach described above you could simply add a static constructor to your base class and either perform the initialization there or call the method that will perform the desired initialization. The resulting base class might look like this:

[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;
}

关于c# - 使用基类进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28558652/

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