1

下面的代码存在于一个没有构造函数的实例类中,我不知道从哪里开始为它编写单元测试。

例如价格是“2/9”所以 secondPart 是 9并且 _random 是 Random 类的对象

    public string RefreshPrice(string price, out bool isUpOrDown, out bool isChanged)
    {
        if (string.IsNullOrEmpty(price))
        {
            isUpOrDown = false;
            isChanged = false;
            return price;
        }

        int secondPart;
        string[] priceParts = price.Split('/');
        int newPrice = 0;
        if(int.TryParse(priceParts[1], out secondPart))
        {
            newPrice = secondPart >= 2 ? _random.Next(2, 20) : 2;
        }

        isUpOrDown = (newPrice > secondPart);
        isChanged = (newPrice != secondPart);

        secondPart = newPrice;
        return string.Format("{0}/{1}", priceParts[0], secondPart);
    }
4

1 回答 1

2

没有构造函数的实例类

所以这个类将有一个默认的ctor:

Legacy legacyUnderTest = new Legacy();

如果_random未在默认 ctor 中设置,您应该创建一个辅助方法getLegacyUnderTest来设置 _random,或者它是如何在生产中设置的,或者查看这个堆栈溢出答案,以便在使用PrivateObject的测试期间访问私有。

private Legacy getLegacyUnderTest()
{
    Legacy result = new Legacy();
    //set _random however it is set in production for the general need of your test
    return result;
}

由于它们是out,因此您需要将bool标志声明为测试安排步骤的一部分,那么您就可以开始了:

[TestMethod]
public void RefreshPrice_EmptyPriceIsNotUpDownIsNotChange_ReturnsInitalPrice()
{
    //Arrange
    Legacy legacyUnderTest = new this.getLegacyUnderTest();
    bool isUpDown = false;
    bool isChange = false;
    string initialPrice = string.Empty;

    //Act
    string result = legacyUnderTest.RefreshPrice(initalPrice, isUpDown, isChange);

    //Assert
    Debug.IsEqual(initalPrice, result);
}

现在(在解决了我通过在我面前编写没有 VS 的代码段不可避免地产生的问题之后)你只需要改变 的值isUpDownisChangeinitialPrice涵盖你需要测试的所有可能性,你应该会很好。

这应该是初始价格的不同格式(有效、空、空和无效格式)以及这些标志的不同真/假组合。

于 2012-10-13T17:59:16.227 回答