首先,我是Quartz.net和Moq的新手。
我正在尝试使用Moq对Quartz.net Execute方法进行单元测试。 Execute()在IJob接口中定义。 Execute方法需要将IJobExecutionContext传递给它。
我创建了一个名为RunItinerary的新作业类,它继承自IJob接口。以下是我所拥有的一个例子。
public class RunItinerary : IJob
{
public RunItinerary()
{
}
public RunItinerary(IBFDatabase db) : base(db)
{
}
public override void Execute(IJobExecutionContext context)
{
// magic happens
}
}
以下是我的单元测试示例。我在尝试进行简单的单元测试时都没有成功。以下是我尝试过的测试示例。
var mockIJobExecutionContext = new Mock<IJobExecutionContext>();
var runItinerary = new RunItinerary();
runItinerary.Execute(mockIJobExecutionContext.Object);
mockIJobExecutionContext.VerifyAll();
以下是错误:( x将掩盖内部名称)
Test method xx.xxxxxx.xxxxxxxx.xxxJobs.UnitTest.RunItineraryTest.Execute_Success threw exception:
xx.common.Data.Exceptions.DatabaseConfigurationSectionNotFoundException: JobDatabase
at xx.common.Data.Abstract.xxDatabase..ctor(String configSectionName) in xxDatabase.cs: line 39
at xx.windows.Scheduler.Data.JobDatabase..ctor(String configSectionName) in JobDatabase.cs: line 24
at xx.windows.Scheduler.Data.JobDatabase..ctor() in JobDatabase.cs: line 20
at xx.windows.Scheduler.Jobs.BaseJob..ctor() in BaseJob.cs: line 45
at xx.windows.Scheduler.xxxJobs.RunItinerary..ctor() in RunItinerary.cs: line 31
at xx.windows.Scheduler.xxxJobs.UnitTest.RunItineraryTest.Execute_Success() in RunItineraryTest.cs:
line 177
我相信我缺少的东西是在mockIJobExecutionContext.Setup(x =&gt; x。???????)中,我只是无法弄清楚我需要用.Setup做什么( )
我已经回顾了有关单元测试此类Execute()的类似帖子,但是样本代码没有明确的答案。
如果有人可以提供答案,请为此提供样本单元测试吗?
答案 0 :(得分:0)
似乎RunItinerary
(您正在测试的课程)有一个&#39;默认&#39;当涉及它对IBFDatabase
的依赖时的行为,这似乎是新建一个具体类JobDatabase
的实例。因为这是一个单元测试,所以JobDatabase
失败可能是因为缺少配置(例如连接字符串等)
JobDatabase.cs中的xx.windows.Scheduler.Data.JobDatabase..ctor():第20行
幸运的是,您似乎有一个替代RunItinerary
构造函数,允许您提供IBFDatabase
依赖项:
var mockJobExecutionContext = new Mock<IJobExecutionContext>();
var mockBFDatabase = new Mock<IBFDatabase>();
// You may need to do the minimal required Setups on `mockBFDatabase` here
var runItinerary = new RunItinerary(mockBFDatabase.Object); // i.e. use the other ctor
runItinerary.Execute(mockIJobExecutionContext.Object);
mockJobExecutionContext.Verify(x => x.SomeMethod(someParam), Times.Once);
mockBFDatabase.Verify(x => x.FetchSomeData(theIdIAmExpecting), Times.Once);
虽然将单元测试(和依赖注入)改进遗留代码以使其具有“后备”功能时,这种情况非常普遍。如果没有提供注入依赖项,它会将类连接到它们的依赖项,我建议您尝试删除这些ASAP以消除与具体依赖项的耦合,并将其替换为IoC容器管理策略 - 这样您就可以100%确定代码你是单元测试确实是真正的生产代码。