在上篇文章中,桩对象是由外部代码在测试开始之前设置。本文将通过工厂类,在被测代码内容初始化桩对象。
1.被测类
public class LogAnalyzer
{
private const int minFileNameLength = 6;
private IExtensionManager manager;
//使用工厂
public LogAnalyzer()
{
manager = ExtensionManagerFactory.Create();
}
//支持文件类型及文件名是否足够长
public bool IsValidLogFileName(string fileName)
{
return manager.IsValid(fileName) && Path.GetFileNameWithoutExtension(fileName).Length > minFileNameLength;
}
}
2.工厂类
static public class ExtensionManagerFactory
{
static private IExtensionManager customManager = null;
static public IExtensionManager Create()
{
if (customManager != null)
return customManager;
return new FileExtensionManager();
}
static public void SetManager(IExtensionManager mgr)
{
customManager = mgr;
}
}
3.测试类
[TestFixture]
public class LogAnalyzerTests
{
[Test]
public void IsValidLogFileName_NameShorterThan6charsButSupportedExtension_ReturnFalse()
{
//创建桩对象
StubExtensionManager fakeManager = new StubExtensionManager();
fakeManager.ShouldExtensionBeValid = true;
//将桩对象赋给工厂类
ExtensionManagerFactory.SetManager(fakeManager);
//新建analyzer并注入桩对象
LogAnalyzer analyzer = new LogAnalyzer();
bool result = analyzer.IsValidLogFileName("s.log");
Assert.IsFalse(result, "File name with less than 5 chars should have failed the method, even if the extension is supported.");
}
}