C# 如何扩展具有私有构造函数的对象?

C# 如何扩展具有私有构造函数的对象?,c#,unit-testing,constructor,C#,Unit Testing,Constructor,我有一个person对象,它有一个来自外部服务的私有构造函数。在构造函数中,从数据库中删除firstname和lastname。现在对于单元测试,我想输入firstname和lastname,以便在单元测试中不命中数据库 如何扩展我的类并添加一个构造函数扩展,该扩展为单元测试中的firstname和lastname提供数据?如果一个类只有一个私有构造函数,那么除了作为嵌套类型之外,您不能从它派生。基本上,您想要使用的类型听起来不适合在测试中使用:( 当你说“来自外部服务的类型”时,确切的意思是什

我有一个
person
对象,它有一个来自外部服务的私有构造函数。在构造函数中,从数据库中删除
firstname
lastname
。现在对于单元测试,我想输入
firstname
lastname
,以便在单元测试中不命中数据库

如何扩展我的类并添加一个构造函数扩展,该扩展为单元测试中的
firstname
lastname
提供数据?

如果一个类只有一个私有构造函数,那么除了作为嵌套类型之外,您不能从它派生。基本上,您想要使用的类型听起来不适合在测试中使用:(

当你说“来自外部服务的类型”时,确切的意思是什么?你的意思是源代码根本就不在你的控制之下?或者它部分地在你的控制之下?例如,如果这是生成的代码,你可以考虑添加一个构建步骤来修改它…

  • 构造函数不是继承的,所以您需要为派生类定义一个新的构造函数
  • 通过派生类进行单元测试不是一个好主意,因为您需要复制任何私有实现
  • 听起来您的类与某些外部数据源紧密耦合——您是否可以注入某种可以在单元测试中模拟的提供者

    编辑


    根据评论,这似乎是一个第三方库,在这种情况下,单元测试不是你的责任。你应该改为单元测试你的代码,模拟/存根第三方库的使用(这也意味着你应该通过某种接口松散地耦合库的使用).

    “Person”类在外部包中定义,该外部包是unchangable@user3311522:在这种情况下,恐怕您不能这样做。该类型是否实现了任何类型的接口,您可以为其创建替代实现?如果
    Person
    类来自外部包,您应该在域代码中对其进行抽象。(你不希望你的域依赖于外部包)。那么你的单元测试只关心你对
    Person
    类的抽象。第2点是不正确的-如果构造函数受到
    保护,或者它是
    内部的
    并且在同一个程序集中(或者由于InternalsVisibleTo而具有可见性的程序集).Heck,即使它是私有的,您仍然可以在同一类的源代码中从它派生(作为嵌套类型)。@JonSkeet point take-删除它,因为您在回答中包含了它。