我该怎么做才能为这个依赖System.Random的代码编写单元测试?

时间:2012-10-13 17:46:30

标签: c# .net unit-testing

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

E.g价格是“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);
    }

1 个答案:

答案 0 :(得分:2)

  

没有构造函数的实例类

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

Legacy legacyUnderTest = new Legacy();

如果未在默认ctor中设置_random,则应创建辅助方法getLegacyUnderTest以设置_random,无论是在生产中如何设置,还是查看this stack overflow answer在使用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的片段而解决的问题)之后,您只需要更改isUpDownisChange和{{1}的值覆盖你需要测试的所有可能性,你应该做得很好。

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