【发布时间】:2015-03-16 03:57:42
【问题描述】:
假设我有一个如下所示的界面:
interface IMyAPIService
{
List<Order> GetOrders();
}
还有一个实现它的类:
class MyAPIService : IMyAPIService
{
public List<Order> GetOrders() {}
public bool Login() {}
}
登录调用外部服务。我可以模拟外部服务,因此测试登录没问题。
但是,GetOrders 必须先调用 Login,然后才能执行它需要执行的操作。
我希望能够测试 GetOrders 在登录错误时也会返回错误,但我无法模拟登录,因为它是同一类的成员。我可以模拟 Login 调用的外部服务并确保它返回错误,然后我知道 Login 会返回错误,但我不确定这是否是正确的方法。
我应该只测试 IMyAPIService 中的接口方法而不是 MyAPIService 中的所有公共方法吗?那我该如何测试登录呢?
【问题讨论】:
-
“我可以模拟 Login 调用的外部服务并确保它返回错误”——这是一种有效的测试方式。
-
只有“GetOrders”才会调用登录以便我可以测试它时,是否可以公开登录?
-
如果逻辑上不应该公开,您不必独立测试它。在这种情况下,它是另一个公共函数的辅助函数,因此请测试公共函数,但请确保测试私有辅助函数的所有可能输出。如果您看到私有函数变得非常复杂(许多可能的结果、依赖项等),这表明它可能应该是一个单独的类,当然您将自己彻底测试该类。
标签: c# .net unit-testing tdd