1

我正在阅读“单元测试的艺术”atm,并且在使用属性传递接口时遇到了一些问题。该书指出:“如果您希望参数是可选的,请使用属性 getter/setter,这是定义可选参数的更好方法,而不是为每个依赖项向类添加不同的构造函数。”

属性示例的代码如下:

public class LogAnalyzer
{
    private IExtensionManager manager;
    public LogAnalyzer ()
    {
        manager = new FileExtensionManager();
    }

    public IExtensionManager ExtensionManager
    {
        get { return manager; }
        set { manager = value; }
    }

    public bool IsValidLogFileName(string fileName)
    {
        return manager.IsValid(fileName);
    }
}

[Test]
Public void
IsValidFileName_NameShorterThan6CharsButSupportedExtension_ReturnsFalse()
{
    //set up the stub to use, make sure it returns true
    ...
    //create analyzer and inject stub
    LogAnalyzer log = new LogAnalyzer ();
    log.ExtensionManager=someFakeManagerCreatedEarlier;

    //Assert logic assuming extension is supported
    ...
}

我何时/如何使用此功能?我能想到的唯一场景(这可能是错误的!)是如果我在一个类中有两种方法,

Method1() 从配置文件中检索数据库连接字符串,并包含对检索到的字符串的某种形式的检查。

Method2() 然后连接到数据库并返回一些数据。这里的检查可能是返回的数据不为空?

在这种情况下,为了测试 Method1(),我可以声明一个实现 IExtensionManager 接口的存根,其中存根有一个字符串,它应该通过我在 method1() 中的任何错误检查。

对于 Method2(),我声明了一个实现接口的存根,并在存根类中声明了一个包含一些数据的数据表。id 然后使用属性将其分配给私有管理器变量,然后调用 Method2?

以上可能是完整的 BS,所以如果是的话,如果有人让我知道并删除它,我将不胜感激。

谢谢

4

1 回答 1

0

属性注入用于在创建对象后更改其行为。

顺便说一句,您的代码与 . 紧密耦合FileExtensionManager,这是IExtensionManager. 您将如何LogAnalyzer使用默认管理器进行测试?使用构造函数注入为您的对象提供依赖项 - 这将使它们可测试:

public LogAnalyzer (IExtensionManager manager)
{
    this.manager = manager();
}
于 2012-07-11T10:47:05.953 回答