单元测试Quartz.net执行()

时间:2014-10-24 18:03:18

标签: c# unit-testing moq quartz.net quartz.net-2.0

首先,我是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()的类似帖子,但是样本代码没有明确的答案。

如果有人可以提供答案,请为此提供样本单元测试吗?

1 个答案:

答案 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%确定代码你是单元测试确实是真正的生产代码。