2015-02-05 82 views
0

使用JustMock:JustMock:嘲弄静态方法调用不工作

我不知道为什么我安排调用静态方法试图执行原始。

[Test] 
public void RunCompleteDivxJob_Negative_Exception() 
{ 
    DebugView.IsTraceEnabled = true; 
    var mediaId = 2000999; 
    var mediaTypeId = (int)CmtMediaType.Video; 
    var queueCmtId = 9999; 
    var cmtFileType = CmtFileType.SourceMediaFile; 
    var statusError = CmtQueueStatus.Error; 
    var exception = new Exception("test"); 

    // ARRANGE 
    var encodeJobStateMachineManager = Mock.Create<EncodeJobStateMachineManager>(Behavior.CallOriginal); 
    var logger = Mock.Create<Logger>(Behavior.CallOriginal, typeof(EncodeJobStateMachineManager)); 
    var inst = new PrivateAccessor(encodeJobStateMachineManager); 
    inst.SetProperty("_log", logger); 
    var createCompleteJobCalled = false; 
    Mock.Arrange(() => DivxEncodeJob.CreateCompleteJob(mediaId, mediaTypeId, queueCmtId, cmtFileType)) 
    .DoInstead(() => createCompleteJobCalled = true); 
    Mock.Arrange(() => encodeJobStateMachineManager.EncodeJob.Submit()).Throws(exception).MustBeCalled(); 
    logger.Arrange(x => x.Error(Arg.AnyString, exception)).MustBeCalled(); 
    //Mock.SetupStatic(typeof(QueueDAO)); 
    var updateQueueStatusCalled = false; 
    Mock.Arrange(() => QueueDAO.UpdateQueueStatus(queueCmtId, statusError)).DoInstead(() => updateQueueStatusCalled = true); 

    // ACT 
    encodeJobStateMachineManager.RunCompleteDivxJob(mediaId, mediaTypeId, queueCmtId, cmtFileType); 

    // ASSERT 
    Mock.Assert(encodeJobStateMachineManager); 
    Assert.IsTrue(createCompleteJobCalled); 
    Assert.IsTrue(updateQueueStatusCalled); 
} 

第一静态调用正确嘲笑方法调用:

Mock.Arrange(() => DivxEncodeJob.CreateCompleteJob(mediaId, mediaTypeId, queueCmtId, cmtFileType)) 
      .DoInstead(() => createCompleteJobCalled = true); 

但第二静态呼叫正在执行的原代码:

Mock.Arrange(() => QueueDAO.UpdateQueueStatus(queueCmtId, statusError)).DoInstead(() => updateQueueStatusCalled = true); 

这些基本上称为完全相同。那么为什么第一个按预期工作,第二个没有?

+0

如何将'statusError'传递给'QueueDAO.UpdateQueueStatus'? – 2015-02-05 20:15:00

+0

作为一个枚举?不确定你的意思是“如何”? – dcinadr 2015-02-05 21:44:20

回答

0

可能的问题是QueueDAO.UpdateQueueStatus未使用预期参数调用。检查是否将.IgnoreArguments()条款添加到其安排将使其工作。如果是的话,那么这是一个争论的问题。

使用调试器仔细检查方法调用的参数。或者,您可以在调试器中观看DebugView.FullTrace,向下浏览至QueueDAO.UpdateQueueStatus调用的截取内容,并查看调用的参数以及为什么没有选择该调用的安排。