我正在尝试对我正在构建的计算器(使用复合模式)进行测试。第一种方法应该添加75美元,这可以正常工作,但是当第二种方法运行时,“服务”被重置并具有0美元作为工作成本。如果我将两种方法合二为一,那么一切都按照我的预期进行。 我如何在服务领域保留价值?
[X1, Y1] = linE(3, 1, 7, 10, 2);
[X2, Y2] = linE(3, 10, 7, 1, 2);
答案 0 :(得分:4)
由于不能保证单元测试全部一起运行,或者以特定顺序运行,因此最好避免在它们之间添加时间依赖性(即要求它们运行)一个特定的订单,以便正常工作)。
相反,提取出将劳动力添加到单独的辅助方法中的“硬部分”,并使两种方法测试特定的方案。
[TestClass()]
public class JobTests
{
private Service service;
[TestInitialize]
public void init()
{
service = new EmergencyService();
}
[TestMethod()]
// add one hour of service at $75/50 rate
public void Job_OnFullCost_Is75()
{
// Arrange
AddHourOfService(75, 50);
// Act
var expected = 75.0M;
var actual = service.JobCost;
// Assert
Assert.AreEqual(expected, actual);
}
[TestMethod()]
// add another hour to the service, at same rate of $175/60
public void Job_OnFullCost_Is125()
{
// Arrange
AddHourOfService(75, 50);
AddHourOfService(75, 50);
// Act
var expected = 125.0M;
var actual = service.JobCost;
// Assert
Assert.AreEqual(expected, actual);
}
private void AddHourOfService(int cost, int time)
{
var laborTime = new LaborTime(
checkIn: new DateTime(year: 2016, month: 7, day: 20, hour: 10, minute: 0, second: 0),
checkOut: new DateTime(year: 2016, month: 7, day: 20, hour: 11, minute: 0, second: 0)
);
var laborRates = new LaborRates(75, 50);
service = new Labor(service, laborTime, laborRates);
}
}
除了删除测试之间的时间耦合之外,这还具有很好的副作用,使得测试的目的直接来自代码。您不再需要像“以75美元/ 50美元的价格添加一小时服务”之类的评论,因为AddHourOfService(75, 50)
非常明显地发生了什么。让代码以这种方式自我记录是好的,因为评论太容易与你的代码失去同步(正如你的第二条评论中所说的那样“$ 175/60”,而这显然不是测试的内容)。