我有一个CommandExecutor类,它包含所有命令(方法)。我必须测试一个从给定的2个参数生成报告的方法。方法使用数据库来检查它是否已生成。
编辑1:
属性:
public IEngine Engine { get; set; }
IEngine界面:
ICommandExecutor CommandExecutor { get; }
IInputReader InputReader { get; }
IOutputWriter OutputWriter { get; }
IDatabase Database { get; }
CommandExecutor有一个方法Execute。我有其他类(命令工厂)创建ICommand。引擎从文件读取输入,例如,检查它是否有效,拆分参数等...并创建一个ICommand。然后CommandExecutor接受此ICommand并调用方法Execute。方法Execute有switch case,如果成功或者命令不成功,每个case返回一个字符串,它会抛出一个exepction。我想单元测试一个依赖于数据库的方法。我可以模拟此属性Engine(在CommandExecutor中)并调用方法来检查它是否正常工作? CommandExecutor中的每个方法都调用this.Engine.Database .....
引擎构造函数:
public Engine(
IInputReader reader,
IOutputWriter writer,
ICommandExecutor commandExecutor,
IDatabase database)
{
this.InputReader = reader;
this.OutputWriter = writer;
this.CommandExecutor = commandExecutor;
this.CommandExecutor.Engine = this;
this.Database = database;
}
var reportFound = this.Engine.Database.GetReport(name, model);
if (reportFound != null)
{
throw new DuplicateEntryException(Constants.Duplicate);
}
Do something......
return string.Format(Constants.Test, model, name);
我模拟了数据库(此方法也是GetReport),使用模拟数据库的引擎。如何模拟CommandExecutor引擎属性并调用我想要测试的方法?
由于
答案 0 :(得分:0)
不是真的没有,问问自己为什么要这样做。如果你想保证你的类中的方法在同一个类中调用另一个方法,那么听起来就像业务逻辑被封装在你不想要绕过它的方法中。重构为一个新类并在其上为该方法拍一个接口,依赖注入那里,现在你可以模拟它。