单元测试开始,我不知道如何测试我们的老代码,这看起来就像这样:单元测试方法具有依赖性(无接口)
public Player DetermineWinner(Player a, Player b)
{
if(a.Age>b.Age)
....
///few more conditions checking properties of both players
}
class Player
{
public Player (DBConnection c, world w, DateTime logTime)
{} //not easy to mock...
}
如何嘲笑呢?我明白,如果Player实现了一个接口,我可以简单地创建一个模拟并将其传递到具有期望值的单元测试中,但这不是这种情况。 Player类使用各种参数实例化,所以我不能在单元测试期间简单地创建一个实例并传递它 - 它取决于各种外部对象。 我需要模拟Player对象并同时设置它的属性,以便测试是确定性的。开始的最佳方法是什么?
下次我应该使用接口来解耦吗?
把类的所有依赖'Player'它使用了一些的外部资源('DbConnection'至少)背后的接口或使他们的方法是虚拟的。然后你可以用“模拟”依赖关系来测试'Player'类。其他方法使用一些“没有限制”的嘲笑框架,它会为你做 – Fabio
这里的*真实*问题不是“如何嘲笑”,而是被测试代码的非常糟糕的设计。具体而言,'Player'类不应该依赖'DBConnection'。相反,它的构造函数只应该获取真正属于某个玩家的数据项,以及在其他地方读取/写入玩家数据的数据库访问权限。 –
什么是您的Visual Studio版本? – zaitsman