我有一个名为ConvertToBusinessEntity
的方法的存储库,它将数据从数据源转换为业务对象。该方法应该被存储库中的其他方法使用,即Get,GetAll等。
此方法经过单元测试。我检查是否正在从数据源中正确检索数据,并将值放入实体正确的属性中。
但现在我需要测试并创建应该调用GetEntity
的{{1}}方法。 ConvertToBusinessEntity
背后的逻辑已经过测试。我只需要知道如何验证正在测试的类中的方法是否被调用(而不是依赖)。
有谁知道如何做到这一点或任何替代方法?
我想到了另一种方法,但我不确定它是否是最好的。我可以扩展被测试的类,并且每次调用该方法时都会增加一个计数器。
另一个是嘲笑班级本身。
你怎么看?还有其他建议吗?答案 0 :(得分:3)
在存储库中使用ConvertToBusinessEntity
并不是一个好主意。存储库的职责是使用数据存储(CRUD)。数据类型的映射是某些映射器类的责任。否则,您的存储库有太多责任。看看你想要测试的内容:
我检查数据源是否正确检索数据 和将值放入实体正确的属性
你看到这个和?您的测试可能因两个完全不同的原因而失败。您还应该在两个完全不同的原因上更改存储库。这里最好的方法是直接持久化业务实体。现代ORM允许这样做而不会使用属性污染业务实体或强制它继承某些特定于数据访问的类。
如果您真的想在存储库中拥有数据映射逻辑,那么将其设置为私有(实际上只有存储库应该需要将业务实体转换为某个数据访问对象)并且不关心如何实现此逻辑。让它成为内部类实现的一部分。您应该只关心存储库是否能够接受或返回已填充的业务实体 - 这是存储库的责任。在存储库中实现映射的方式并不重要。您应该测试 存储库的功能,而不是如何。因此,只需检查存储库是否返回了预期的业务对象。
答案 1 :(得分:1)
我只需要知道如何验证正在测试的类中的方法是否被调用(而不是依赖项)。
但你真的需要这样做吗?如果您的GetEntity
方法操作正确,您是否真的关心 的运作方式?如果它通过委托ConvertToBusiness
或通过其他方式执行其功能,你真的在乎吗?
我建议您改为
但是,您可以声明,如果我这样做,我不是 unit 测试我的方法代码;我对GetEntity
的测试取决于GetEntity
方法和ConvertToBusiness
方法:两个单元,因此是集成测试而不是单元测试。但是你嘲笑运行时环境的方法吗?当然不是。单元测试和集成测试之间的界限不太明确。
更哲学上,在许多情况下,无法创建好的模拟对象。原因在于,对于大多数方法,对象委托给关联对象的方式是 undefined 。是否委托以及如何将规范作为实现细节留下。唯一的要求是,在委托时,该方法满足其委托的前提条件。在这种情况下,只有功能齐全的(非模拟)委托才会这样做。如果真实对象检查其前提条件,则无法满足委托的前提条件将导致测试失败。调试测试失败很容易。