【发布时间】:2017-02-13 19:34:19
【问题描述】:
从单元测试开始,我想知道如何测试我们的旧代码,看起来像这样:
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 对象并同时设置其属性,以便测试具有确定性。最好的方法是什么?
下次我应该使用接口来解耦吗?
【问题讨论】:
-
将使用一些外部资源(至少
DbConnection)的类Player的所有依赖项放在接口后面或使其方法虚拟。然后您可以使用“模拟”依赖项测试Player类。其他方法使用一些“不严格”的模拟框架来为你做这件事 -
这里的真正问题不是“如何模拟”,而是被测试代码的设计非常糟糕。具体来说,
Player类不应依赖于DBConnection。相反,它的构造函数应该只获取真正属于玩家的数据项,并在其他地方完成读取/写入玩家数据的数据库访问。 -
您的 Visual Studio 版本是多少?
标签: c# unit-testing mocking