Mock属性和调用方法在同一个类C#

时间:2016-02-13 00:20:51

标签: c# database methods mocking moq

我有一个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引擎属性并调用我想要测试的方法?

由于

1 个答案:

答案 0 :(得分:0)

不是真的没有,问问自己为什么要这样做。如果你想保证你的类中的方法在同一个类中调用另一个方法,那么听起来就像业务逻辑被封装在你不想要绕过它的方法中。重构为一个新类并在其上为该方法拍一个接口,依赖注入那里,现在你可以模拟它。