【问题标题】:How to fake fluent constructor for unit test如何伪造流利的构造函数进行单元测试
【发布时间】:2013-09-20 13:08:25
【问题描述】:

我有一个类具有另一种类类型的属性:

public class MyClass
{
    public DepdendenceClass DependenceProp { get; set; }

    private MyClass(){}
    public MyClass(MyClassFactory factory)
    {
        this.DependenceProp = factory.DependenceProp;
    }
}

public class DepdendenceClass
{
    public int key { get; set; }

    private DepdendenceClass() { }
    public DepdendenceClass(DepdendenceClassFactory factory)
    {
        this.key = factory.key;
    }
}

我隐藏了基础构造函数,因为我不希望它可以创建空实例

每个都有一个流利的有序构造函数,让我编写这个测试:

[Test]
public void MyClassConstructorTest()
{
    DepdendenceClass depdendencePropExpected = DepdendenceClassFactory.InitCreation()
                                                    .WithKey(1)
                                                    .Create();

    MyClass myClassActual = MyClassFactory.InitCreation()
                        .WithDependency(depdendencePropExpected)
                        .Create();
    Assert.That(myClassActual.DependenceProp, Is.EqualsTo(depdendencePropExpected));
}

有没有办法将 MyClassConstructor Test 与第二类的构造函数隔离开来?

【问题讨论】:

  • 当您在类中声明了至少一个构造函数时,将不再生成默认构造函数。所以在你的两个类中,私有构造函数都是没有意义的。
  • 谢谢,我只是在帖子中找到了私有的,在那里我学习了流利的构造函数并使用它,少写了1行:)

标签: c# unit-testing constructor mocking fluent


【解决方案1】:

我隐藏了基础构造函数,因为我不希望它可以创建空实例

如果您想对应用程序的其余部分隐藏默认构造函数,但又想在测试项目中使用它,则应将默认构造函数显式定义为内部:

internal MyClass(){}

然后将 InternalsVisibleTo 属性添加到定义 MyClass 的项目的 AssemblyInfo.cs 中。

如果您的测试项目的名称是:MySolution.Fixtures,您将拥有:

[assembly: InternalsVisibleTo("MySolution.Fixtures")]

通过这种方式,您可以在测试中使用默认构造函数并将其与流式构造函数隔离

【讨论】:

  • 是的,可能是一种解决方法,我读过它但没有想到它,因为我正在搜索完全隔离构造函数并编写 .WithDependency(fake)
  • 在这种情况下,您需要创建一个接口:IDependenceClass 并修改 WithDependency 的签名以接受该接口。然后你可以提供一个虚假的实现或使用一个模拟框架。
  • 我害怕这样的一些......对于这种测试需求来说它只是过大
  • 现在测试但不起作用:我的测试方法位于名为“FunzIA.UnitTest.DL”的项目的“Tests”文件夹中,我将其添加到 assemblyInfo:[assembly: InternalsVisibleTo("FunzIA. UnitTest.DL")] 但编译器说没有找到没有参数的方法
  • 语法正确。该属性应放置在定义 MyClass 的程序集中。您检查它是否放置在正确的组件中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2021-09-20
  • 1970-01-01
  • 2010-09-26
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多