0

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

前任。我想在下面测试这个方法,它接受一个 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

4 回答 4

1

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

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

于 2013-06-05T07:48:53.177 回答
0

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

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

我不能说使用具体方法有什么本质上的错误,特别是如果它是一个小程序的一小部分......但是,我喜欢把事情搞砸。

于 2013-06-04T19:25:52.677 回答
0

您可以使用默认参数。

void print(int a, string b = "default")
{
    Console.WriteLine(a + b);
}
于 2013-06-04T19:23:41.467 回答
0

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

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

重要的是,您要打破依赖关系,就像在隔离中测试一小块逻辑/行为一样。通过这种方式,您可以获得单元测试 IMO 的真正价值。

于 2013-06-05T05:04:38.770 回答