MSUnit 测试断言错误。我知道为什么,但我想不出如何解决它。帮助!我该怎么做才能断言 3 是用户数?
MSUnit test assertion is WRONG. I know why, but I can't think of how to fix it. Help! What can I do to get my assertion that 3 is the count of users?
我是单元测试的新手,需要一些帮助。这个例子仅供我学习,我实际上并没有计算静态变量中的用户数,因为我显然可以只使用 List 数据结构上的计数 属性。帮我弄清楚如何得到我原来的断言,即有 3 个用户。这是代码:
Class 用户
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 测试的用户仍在内存中。我应该怎么做才能获得三个用户?我应该对第一个 Bob 进行垃圾回收吗?
另外,我认为进入另一个测试的测试不是好的单元测试。我知道这可能是一个争论,但我会听取社区对此代码的任何建议。感谢您的帮助。
显而易见的解决方案是删除 static
计数器。如您所见,当您进入第二个单元测试方法 UserCount()
时,该计数器的值仍然是 1
从执行第一个单元测试方法 UserMoney()
之前。
如果您想保留计数器(出于学习目的以查看发生了什么),您可以使用清理方法,该方法将 "reset" 在 all 之前的环境或每个单元测试方法。在这种情况下,您希望为每个单元测试方法执行将计数器重置为 0
。您可以通过编写一个带有 [TestInitialize]
属性的方法来实现:
[TestInitialize]
public void _Initialize() {
User.Num_users = 0;
}
这样,每个单元测试都以 "clean" 状态运行,在执行实际单元测试方法之前,计数器将重置为 0
。
您可能想查看 Why does TestInitialize get fired for every test in my Visual Studio unit tests? 以了解这些属性的工作原理。
我是单元测试的新手,需要一些帮助。这个例子仅供我学习,我实际上并没有计算静态变量中的用户数,因为我显然可以只使用 List 数据结构上的计数 属性。帮我弄清楚如何得到我原来的断言,即有 3 个用户。这是代码:
Class 用户
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 测试的用户仍在内存中。我应该怎么做才能获得三个用户?我应该对第一个 Bob 进行垃圾回收吗?
另外,我认为进入另一个测试的测试不是好的单元测试。我知道这可能是一个争论,但我会听取社区对此代码的任何建议。感谢您的帮助。
显而易见的解决方案是删除 static
计数器。如您所见,当您进入第二个单元测试方法 UserCount()
时,该计数器的值仍然是 1
从执行第一个单元测试方法 UserMoney()
之前。
如果您想保留计数器(出于学习目的以查看发生了什么),您可以使用清理方法,该方法将 "reset" 在 all 之前的环境或每个单元测试方法。在这种情况下,您希望为每个单元测试方法执行将计数器重置为 0
。您可以通过编写一个带有 [TestInitialize]
属性的方法来实现:
[TestInitialize]
public void _Initialize() {
User.Num_users = 0;
}
这样,每个单元测试都以 "clean" 状态运行,在执行实际单元测试方法之前,计数器将重置为 0
。
您可能想查看 Why does TestInitialize get fired for every test in my Visual Studio unit tests? 以了解这些属性的工作原理。