我正在阅读“单元测试的艺术”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 ,所以如果是的话,如果有人会让我知道并将其删除,我会很感激。
由于
答案 0 :(得分:0)
属性注入用于在创建对象后更改对象的行为。
顺便说一句,您的代码与FileExtensionManager
紧密相关,这是IExtensionManager
的具体实现。您将如何使用默认管理器测试LogAnalyzer
?使用构造函数注入为对象提供依赖关系 - 这将使它们可测试:
public LogAnalyzer (IExtensionManager manager)
{
this.manager = manager();
}