c# - MSUnit 测试断言错误。我知道为什么,但我想不出如何解决它。帮助!我该怎么做才能断言 3 是用户数?
问题描述
我是单元测试的新手,需要一些帮助。这个例子仅供我学习,当我清楚地可以在 List 数据结构上使用 count 属性时,我实际上并没有计算静态变量中的用户数。帮助我弄清楚如何获得我原来的断言,即有 3 个用户。这是代码:
类用户
namespace TestStatic
{
public class User
{
public string Name { get; set; }
public int Dollars { get; set; }
public static int Num_users { get; set; }
public User(string name)
{
this.Name = name;
Num_users++;
}
public int CalculateInterest(int interestRate)
{
return Dollars * interestRate;
}
}
}
使用 MSTest 进行测试
namespace TestStaticUnitTest
{
[TestClass]
public class CalcInterest
{
[TestMethod]
public void UserMoney()
{
// arrange
User bob = new User("Bob");
bob.Dollars = 24;
// act
int result = bob.CalculateInterest(6);
// assert
Assert.AreEqual(144, result);
//cleanup?
}
[TestMethod]
public void UserCount()
{
// arrange
List<User> users = new List<User>(){ new User("Joe"), new User("Bob"), new User("Greg") };
// act
int userCount = User.Num_users;
// assert
Assert.AreEqual(3, userCount);
}
}
}
UserCount 测试中的结果失败,因为存在第四个用户。UserMoney 测试中的用户仍在内存中。我应该怎么做才能获得三个用户?我应该垃圾收集第一个鲍勃吗?
另外,我认为进入另一个测试的测试不会是一个好的单元测试。我知道这可能是一个争论,但我会听取社区关于此代码的任何建议。谢谢您的帮助。
解决方案
显而易见的解决方案是移除static
计数器。如您所见,当您进入第二个单元测试方法UserCount()
时,该计数器的值仍然1
来自UserMoney()
之前第一个单元测试方法的执行。
如果您想保留计数器(出于学习目的以查看发生了什么),您可以使用清理方法,该方法将在所有或每个单元测试方法之前“重置”环境。在这种情况下,您希望0
为每个单元测试方法执行重置计数器。您可以通过编写具有[TestInitialize]
属性的方法来做到这一点:
[TestInitialize]
public void _Initialize() {
User.Num_users = 0;
}
这样,每个单元测试都以“干净”状态运行,其中计数器将0
在实际单元测试方法执行之前重置。
您可能想查看为什么在我的 Visual Studio 单元测试中每次测试都会触发 TestInitialize?看看这些属性是如何工作的。
推荐阅读
- reactjs - 用 redux 做出反应 - 改变响应然后推送到商店?
- fabricjs - Fabric js图像过滤器
- c# - 如何正确比较两个 x 显着双打
- c# - 如果下一行相同,如何仅删除 1 行
- scala - 使用 spark 版本 2 在 HIVE 中哪个更有效,最大或按 desc 限制 1 排序
- python - 按 Pandas 数据框分组并获取计数
- autosar - Autosar 中的 S/R 和 C/S 调用
- algorithm - 如何确保 LUA 代码中的表中没有重复的相邻值?
- azure - App Service 和 Application Insights 之间的安全连接
- postgresql - Java PostgreSQL:连接失败时抑制错误输出