对为什么它对单元测试虚拟对象有用感到困惑

Joh*_*ith 7 c# testing tdd unit-testing

我正在阅读Clean Code: A Handbook of Agile Software Craftsmanship,其中一个例子涉及一个Portfolio班级和一个TokyoStockExchange班级.但是,Portfolio它不是非常可测试,因为它依赖于TokyoStockExchange作为外部API来确定投资组合的价值,这是一个非常不稳定的查找,不利于测试.

因此,他们通过创建一个通用StockExchange接口来解决这个问题,TokyoStockExchange并且DummyStockExchange实现了基类.因此,实现依赖倒置原则,并且在第一PortfolioTest类中可以实例化a DummyStockExchange,将股票价格固定到公司,将DummyStockExchange实例分配给投资组合,并将该公司的一些股票添加到投资组合中,然后断言预期值是否为确实是正确的价值.这是代码:

public class PortfolioTest
{
    private DummyStockExchange exchange;
    private Portfolio portfolio;

    protected void setUp()
    {
        exchange = new DummyStockExchange();
        exchange.fix("MSFT", 100);
        portfolio = new Portfolio(exchange);
    }

    public void GivenFiveMSFTTotalShouldBe500()
    {
        portfolio.add(5, "MSFT");
        Assert.assertEquals(500, portfolio.value());
    }
}
Run Code Online (Sandbox Code Playgroud)

简单地说,我的问题是为什么

如果TokyoStockExchange班级与班级一起工作,我们正在尝试测试Portfolio.显然,如果我们使用新方法创建另一个类来设置股票价格,然后给投资组合中的五个股票,那么一切都会有效.它似乎......无用的测试.我明白,由于股票价格的变化,TokyoStockExchange基本上不可能进行测试,Portfolio但我不明白在相当无用的测试中如何帮助这种情况.

这一切似乎都不知道我们的加法器程序是否有效但是可用的唯一数字是随机生成的,因此我们创建了一个虚拟类,它给了我们2并测试是否2 + 2 = 4.好吧,显然这是真的.我们仍然可以打破TokyoStockExchange,测试仍然会成功,因为它正在测试另一个类.如果这一切看起来都具有欺骗性,它还会导致必须编写额外的代码来测试我们知道的东西.

我认为这是我在理解单元测试时遇到的最大问题.我知道我错了我只是没有看到我猜的光.希望有人可以帮助我.

Jac*_*cob 7

这个想法是你想要单独测试Portfolio类中的逻辑TokyoStockExchange.如果您使用像Moq或Rhino Mocks这样的模拟框架,那么您可以轻松地模拟不同的输出和行为,TokyoStockExchange并编写单元测试以确保Portfolio正确响应.您可以为TokyoStockExchange该类编写单独的单元测试.

这并不是说您不需要在两个类之间进行集成测试.如果不使用模拟对象,很难正确验证所有场景.

用这样一个简单的类作为一个例子很难理解它的价值,但考虑到一个更复杂的类,你需要验证在"实时"类中很难或不可能安排的情况下的测试用例,单元测试会变得更多重要.

  • 确切地说+1.您没有测试TokyoStockExchange,您正在测试Portfolio类是否正常工作. (3认同)