mstest如何创建在同一对象上工作的测试方法(累计)?

时间:2016-08-04 20:05:39

标签: c# mstest

我正在尝试对我正在构建的计算器(使用复合模式)进行测试。第一种方法应该添加75美元,这可以正常工作,但是当第二种方法运行时,“服务”被重置并具有0美元作为工作成本。如果我将两种方法合二为一,那么一切都按照我的预期进行。 我如何在服务领域保留价值?

[X1, Y1] = linE(3, 1, 7, 10, 2);
[X2, Y2] = linE(3, 10, 7, 1, 2);

1 个答案:

答案 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”,而这显然不是测试的内容)。