使用存根而不是具体对象作为参数

时间:2013-06-04 19:16:48

标签: c# unit-testing microsoft-fakes

是否始终需要创建存根并将其作为参数传递给方法,即使我可以将该对象实例化为方法而没有任何问题。

离。我想在下面测试这个方法,它将TargetDataRanger对象作为参数。我应该a。)将它存根并在b中传递。)打破依赖关系并将其置于接口之后然后将其存根并在c中传递它。)实例化它并将其作为具体对象传递给方法。

在下面的这种情况下,我可以使用具体的对象,但这是明智的,它是否打破了一些测试规则或什么?

public virtual Dictionary<DateTime, DateTime> ResolveDates(ISeries comparisonSeries, TargetDateRanger sourceRanger)
    {
        Dictionary<DateTime, DateTime> dates = new Dictionary<DateTime, DateTime>();

        foreach (DateTime keyDate in sourceRanger.ValidDates)
            dates.Add(keyDate, this.ResolveDate(comparisonSeries, keyDate));

        return dates;
    }

4 个答案:

答案 0 :(得分:1)

我认为答案取决于TargetDateRanger.ValidDates的作用。假设您可以完全控制该属性从单元测试中返回的内容,则没有理由单独模拟它。如果它遇到数据库,有一些内部逻辑,取决于DateTime.Now等等,那么你需要模拟它。

基本上,您希望单元测试的“环境”完全在您的控制之下,以便您可以获得可预测的结果并快速查明失败的代码。如果ValidDates有可能返回错误的结果,那么你需要单独测试它并在这种情况下模拟它(这样“不良结果”不会导致你的ResolveDates方法失败,因为问题不存在于那里)。

答案 1 :(得分:0)

您可以使用默认参数。

void print(int a, string b = "default")
{
    Console.WriteLine(a + b);
}

答案 2 :(得分:0)

在单元测试中,我测试我的独立性。我打破了它,有一个驱动程序设置,我可以将变量泵入(如果它是为了接收它们)和存根,所以我可以查看预期的结果。我觉得这对我来说是一个更好的测试理念,但我对编程比较陌生,所以我发现这种测试方式可以让我在同一时间教我很多。

完成后,我将其集成到更大的系统中,使用新的驱动程序和存根输出重新测试它,验证整个流程是否正常工作。

我不能说使用具体方法存在固有的错误,特别是如果它只是一个小程序的一小部分......但是,我喜欢把事情搞清楚。

答案 3 :(得分:0)

如果您正在为此方法编写单元测试,我认为最好隔离/伪造任何外部依赖项。问题是如果你不这样做,例如,如果有人对ValidateDates方法进行了更改,那么你的测试会因为错误的原因而失败。另一方面,您还在测试ValidateDates方法中的内容。这意味着你可能很想测试多个东西。此外,这可能会阻止您为测试提供良好/特定的名称。

请记住,您可以单独/单独地对单元测试ValidateDates方法。

重要的是,您希望在依赖性中作为测试小块逻辑/行为而破坏依赖性。通过这种方式,您可以获得单位测试IMO的实际价值。