我正在阅读“单元测试的艺术”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,所以如果是的话,如果有人让我知道并删除它,我将不胜感激。
谢谢