C# 分离库API

C# 分离库API,c#,unit-testing,mocking,C#,Unit Testing,Mocking,我目前正在用C#编写一个包装器库,它包装了一个COM对象,这个COM对象的API非常小,使用起来很麻烦,而且有点混乱 这是我使用TDD和mocking的第一个项目,如果这不是一个大问题,那么很抱歉。我给了我的一个同事一份库的副本,他注意到的第一件事是API中有大量的接口 我向他解释说,因为我在做单元测试和模拟,我需要接口来阻止测试接触COM对象,他有点理解,但这让我想到,可能我的API有点混乱,让人难以理解 我的问题是-如果我正在编写一个包装器库,其中每个对象都会在某个地方接触到COM API,

我目前正在用C#编写一个包装器库,它包装了一个COM对象,这个COM对象的API非常小,使用起来很麻烦,而且有点混乱

这是我使用TDD和mocking的第一个项目,如果这不是一个大问题,那么很抱歉。我给了我的一个同事一份库的副本,他注意到的第一件事是API中有大量的接口

我向他解释说,因为我在做单元测试和模拟,我需要接口来阻止测试接触COM对象,他有点理解,但这让我想到,可能我的API有点混乱,让人难以理解

我的问题是-如果我正在编写一个包装器库,其中每个对象都会在某个地方接触到COM API,那么最好的方法是什么来分离API并仍然能够测试代码


对于大多数事情,我应该使用抽象类而不是接口吗?或者我应该将仅用于模拟的接口隐藏在某个命名空间中吗?

如果接口仅用于模拟,我建议将其设置为内部接口。然后,您可以将InternalsVisibleToAttribute应用于包装器库,以将内部接口公开给您的测试。

如果接口仅用于模拟目的,我建议将其设置为内部接口。然后,您可以将InternalsVisibleToAttribute应用到您的包装器库中,以将内部接口公开给您的测试。

我发现,除了对同事的评论之外,公开API没有什么大不了的。您的同事会欣赏您的应用程序随着您的前进而变化的灵活性,而不是“杂乱”的API

我不会为此担心,继续你的生活


至于模拟,我肯定更喜欢接口而不是抽象类。你会发现,你越深入这一点,你就会编写组合的应用程序,而不是继承的应用程序。这是因为您希望保持对象较小,依赖项较少,这样测试就不会变得一团糟

除了对同事的评论之外,我还没有发现有一个公开的API有什么大不了的。您的同事会欣赏您的应用程序随着您的前进而变化的灵活性,而不是“杂乱”的API

我不会为此担心,继续你的生活


至于模拟,我肯定更喜欢接口而不是抽象类。你会发现,你越深入这一点,你就会编写组合的应用程序,而不是继承的应用程序。这是因为您希望保持对象较小,依赖项较少,这样测试就不会变得一团糟

干涉像我想象的那么难闻吗?干涉像我想象的那么难闻吗?