C# 如何使现有的公共API可供使用它的外部程序员测试?
我有一个C#公共API,许多第三方开发人员使用它,他们在上面编写了自定义应用程序。此外,API被内部开发人员广泛使用 编写此API时并没有考虑可测试性:大多数类方法都不是虚拟的,并且没有考虑到接口中的因素。此外,还有一些辅助静态方法 由于许多原因,我无法在不导致使用我的API的程序员开发的应用程序发生重大更改的情况下显著更改设计。但是,我仍然希望给使用此API的内部和外部开发人员机会编写单元测试,并能够模拟API中的对象 我想到了几种方法,但没有一种是好的:C# 如何使现有的公共API可供使用它的外部程序员测试?,c#,.net,unit-testing,C#,.net,Unit Testing,我有一个C#公共API,许多第三方开发人员使用它,他们在上面编写了自定义应用程序。此外,API被内部开发人员广泛使用 编写此API时并没有考虑可测试性:大多数类方法都不是虚拟的,并且没有考虑到接口中的因素。此外,还有一些辅助静态方法 由于许多原因,我无法在不导致使用我的API的程序员开发的应用程序发生重大更改的情况下显著更改设计。但是,我仍然希望给使用此API的内部和外部开发人员机会编写单元测试,并能够模拟API中的对象 我想到了几种方法,但没有一种是好的: 传统的方法是强制开发人员创建一个他们
public class UserRepository
{
public UserData GetData(string userName)
{
...
}
}
如果为期望使用具体类(例如“UserData”)的现有客户提供了“IUserData”,则这些客户将中断
此外,正如在评论中提到的,在某些情况下,我们引入一个类,然后为了方便起见将其公开。如果我们接受了一个接口,然后不得不将其作为一个具体的类公开,这可能会导致问题
重大重写或重新设计的最大挑战是当前API有巨大的投资(数千小时的开发,可能与第三方培训一样多)。因此,虽然我同意,从可测试性的角度来看,一个更好的设计重写或抽象层(最终可能成为新的API)将是一个加号,但这将是一个很大的任务,目前可能无法证明成本是合理的
我们确实有针对当前API的测试,但它是更复杂的集成测试,而不是单元测试
此外,正如所提到的,这个问题解决了.NET框架本身在某些领域面临的类似问题
我意识到我可能正在寻找一个不存在的“银弹”,但所有的帮助都很感激。重要的部分是保护许多第三方开发人员投入的大量时间,以及创建当前API的大量现有开发
所有的答案,特别是那些考虑问题的商业方面的答案,都会被仔细地审查。谢谢 您没有提到的一种方法(在大多数情况下我更喜欢这种方法)是为您希望API用户能够伪造的类提取接口。不知道您的API并不是每个类都必须提取接口。第三方用户不应该测试您的API。他们希望根据您的API测试他们的代码,因此他们需要创建API的模拟等,但他们将依靠您对API的测试来确保其工作。或者这就是你的意思?您想让您的API易于测试吗
在这种情况下重新开始,这次考虑测试人员:)另一种方法是创建一个单独的API分支,并在那里执行选项3。那你呢
public interface IUserRepository
{
IUserData GetData(string userName);
}
public class UserRepository
: IUserRepository
{
// The old method is not touched.
public UserData GetData(string userName)
{
...
}
// Explicitly implement the interface method.
IUserData IUserRepository.GetData(string userName)
{
return this.GetData(userName);
}
}