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
,测试仍然会成功,因为它正在测试另一个类.如果这一切看起来都具有欺骗性,它还会导致必须编写额外的代码来测试我们知道的东西.
我认为这是我在理解单元测试时遇到的最大问题.我知道我错了我只是没有看到我猜的光.希望有人可以帮助我.
这个想法是你想要单独测试Portfolio
类中的逻辑TokyoStockExchange
.如果您使用像Moq或Rhino Mocks这样的模拟框架,那么您可以轻松地模拟不同的输出和行为,TokyoStockExchange
并编写单元测试以确保Portfolio
正确响应.您可以为TokyoStockExchange
该类编写单独的单元测试.
这并不是说您不需要在两个类之间进行集成测试.如果不使用模拟对象,很难正确验证所有场景.
用这样一个简单的类作为一个例子很难理解它的价值,但考虑到一个更复杂的类,你需要验证在"实时"类中很难或不可能安排的情况下的测试用例,单元测试会变得更多重要.