单元测试,使用属性传递接口

时间:2012-07-11 10:38:15

标签: unit-testing c#-4.0

我正在阅读“单元测试的艺术”atm和im在使用属性传递接口方面存在一些问题。本书陈述如下:“如果您希望参数是可选的,请使用属性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 ,所以如果是的话,如果有人会让我知道并将其删除,我会很感激。

由于

1 个答案:

答案 0 :(得分:0)

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

顺便说一句,您的代码与FileExtensionManager紧密相关,这是IExtensionManager的具体实现。您将如何使用默认管理器测试LogAnalyzer?使用构造函数注入为对象提供依赖关系 - 这将使它们可测试:

public LogAnalyzer (IExtensionManager manager)
{
    this.manager = manager();
}