3

考虑您有以下方法:

public Foo ParseMe(string filepath)
{
    // break up filename
    // validate filename & extension
    // retrieve info from file if it's a certain type
    // some other general things you could do, etc

    var myInfo = GetFooInfo(filename);

    // create new object based on this data returned AND data in this method
}

目前我有单元测试GetFooInfo,但我认为我还需要为ParseMe. 在这种情况下,您有两个方法返回两个不同的属性 - 并且其中任何一个的更改都可能破坏某些东西 - 是否应该为两者创建单元测试以确定输出是否符合预期?

我喜欢在谨慎方面犯错,并且对发生故障的事情更加警惕,并确保以后的维护更容易,但我对在测试项目中添加非常相似的测试持怀疑态度。这是不好的做法还是有什么方法可以更有效地做到这一点?

我将此标记为与语言无关,但以防万一我使用 C# 和 NUnit - 另外,我只在标题中看到了与此类似的帖子,但问题有所不同。对不起,如果这已经被问到了。

4

4 回答 4

6

ParseMe看起来非常重要,需要进行单元测试。要回答您的确切问题,如果“您有两种方法返回两个不同的属性 - 并且其中任何一个的更改都可能破坏某些东西”,您绝对应该对它们进行单元测试。

即使大部分工作都在 中GetFooInfo,您至少应该测试它是否实际被调用。我对 NUnit 一无所知,但我知道在其他框架(如 RSpec)中,您可以编写类似GetFooInfo.should be_called(:once).

于 2013-05-24T14:38:57.480 回答
4

测试调用另一个方法的方法并不是一个坏习惯事实上,这是一个很好的做法。如果您有一个方法调用另一个方法,它可能正在执行附加功能,应该对其进行测试。

如果您发现自己对一个方法进行单元测试,该方法调用了一个也在进行单元测试的方法,那么您可能正在经历代码重用,这是一件好事。

于 2013-05-24T14:40:50.287 回答
3

我同意@tsm - 绝对测试这两种方法(假设两者都是公开的)。

这可能是方法或类做得太多的味道——违反了单一职责原则。考虑进行提取类重构和解耦这两个类(可能使用依赖注入)。这样您就可以独立测试这两个功能。(也就是说,只有在功能足够复杂以保证它的情况下,我才会这样做。这是一个判断电话。)

这是 C# 中的一个示例:

public interface IFooFileInfoProvider
{
    FooInfo GetFooInfo(string filename);
}

public class Parser
{
    private readonly IFooFileInfoProvider _fooFileInfoProvider;

    public Parser(IFooFileInfoProvider fooFileInfoProvider)
    {
        // Add a null check
        _fooFileInfoProvider = fooFileInfoProvider;
    }

    public Foo ParseMe(string filepath)
    {
        string filename = Path.GetFileName(filepath);
        var myInfo = _fooFileInfoProvider.GetFooInfo(filename);
        return new Foo(myInfo);
    }
}

public class FooFileInfoProvider : IFooFileInfoProvider
{
    public FooInfo GetFooInfo(string filename)
    {
        // Do I/O
        return new FooInfo();  // parameters...
    }
}
于 2013-05-24T14:42:39.110 回答
0

许多开发人员,包括我在内,都采用合约编程方式。这需要您将每种方法视为一个黑匣子。如果方法委托给另一个方法来完成它的任务也没关系,当你在测试方法时。但是您还应该将程序的所有大型或复杂部分作为单元进行测试。因此,您是否需要进行单元测试GetFooInfo取决于该方法的复杂程度。

于 2013-05-25T11:52:04.690 回答